البرنامج التعليمي: ترحيل PostgreSQL إلى قاعدة بيانات Azure ل PostgreSQL عبر الإنترنت باستخدام DMS (كلاسيكي) عبر Azure CLI
يمكنك استخدام Azure Database Migration Service لترحيل قواعد البيانات من مثيل PostgreSQL الداخلي إلىAzure Database من أجل PostgreSQL مع الحد الأدنى من وقت توقف التطبيق. بمعنى آخر، يمكن تحقيق الترحيل بأقل وقت تعطل للتطبيق. في هذا البرنامج التعليمي، يمكنك ترحيل قاعدة بيانات نموذج DVD Rental من مثيل داخلي من PostgreSQL 9.6 إلى Azure Database من أجل PostgreSQL باستخدام نشاط الترحيل عبر الإنترنت في Azure Database Migration Service.
في هذا البرنامج التعليمي، تتعلم كيفية:
- ترحيل مخطط النموذج باستخدام الأداة المساعدة pg_dump.
- ينشئ القالب مثيلاً لـ Azure Database Migration Service.
- إنشاء مشروع ترحيل في Azure Database Migration Service.
- تشغيل الترحيل.
- مراقبة الترحيل.
إشعار
يتطلب استخدام Azure Database Migration Service للقيام بالترحيل عبر الإنترنت إنشاء مثيل استنادًا إلى Premium pricing tier. نقوم بتشفير القرص لمنع سرقة البيانات في أثناء عملية الترحيل.
هام
للحصول على تجربة ترحيل مثالية، توصي Microsoft بإنشاء مثيل لـ Azure Database Migration Service في نفس منطقة Azure مثل قاعدة البيانات الخاصة بالهدف. يمكن أن يؤدي نقل البيانات عبر الأماكن أو المناطق الجغرافية إلى إبطاء عملية الترحيل وإدخال أخطاء.
المتطلبات الأساسية
لإكمال هذا البرنامج التعليمي، تحتاج إلى:
قم بتنزيل وتثبيت إصدار مجتمع PostgreSQL 9.4 أو 9.5 أو 9.6 أو 10. يجب أن يكون إصدار PostGreSQL Server المصدر 9.4 أو 9.5 أو 9.6 أو 10 أو 11 أو 12 أو 13. لمزيد من المعلومات، راجع إصدارات قاعدة بيانات PostgreSQL المعتمدة.
لاحظ أيضًا أن قاعدة بيانات Azure المستهدفة لإصدار PostgreSQL ينبغي أن تكون مساوية لإصدار PostgreSQL المحلي أو أحدث منه. على سبيل المثال، يمكن لـ PostgreSQL 9.6 الترحيل إلى Azure Database لـ PostgreSQL 9.6 أو 10 أو 11 فقط، ولكن ليس إلى Azure Database لـ PostgreSQL 9.5.
إنشاء مثيل في Azure Database لخادم PostgreSQL أو إنشاء Azure Database لخادم PostgreSQL - Hyperscale (Citus).
قم بإنشاء Microsoft Azure Virtual Network for Azure Database Migration Service باستخدام نموذج نشر Azure Resource Manager، والذي يوفر اتصالًا من موقع إلى موقع بالخوادم المصدر المحلية باستخدام إما ExpressRoute أو VPN. لمزيد من المعلومات حول إنشاء شبكة افتراضية، راجع Virtual Network Documentationوخاصة مقالات التشغيل السريع التي تحتوي على التفاصيل خطوة بخطوة.
إشعار
في أثناء إعداد الشبكة الظاهرية، في حال كنت تستخدم ExpressRoute مع شبكة الاتصال النظير لـ Microsoft، قم بإضافةنقاط نهاية الخدمة التالية إلى الشبكة الفرعية التي سيتم توفير الخدمة فيها:
- نقطة نهاية قاعدة البيانات الهدف (على سبيل المثال، نقطة نهاية SQL ونقطة نهاية Azure Cosmos DB وما إلى ذلك)
- نقطة نهاية التخزين
- نقطة نهاية ناقل الخدمة
هذا التكوين ضروري لأن Azure Database Migration Service تفتقر إلى الاتصال بالإنترنت.
تأكد من أن قواعد Network Security Group (NSG) لشبكتك الظاهرية لا تحظر المنفذ الصادر 443 من ServiceTag لـ ServiceBus والتخزين وAzureMonitor. لمزيد من التفاصيل عن تصفية نسبة استخدام الشبكة للشبكة الظاهرية الخاصة بمجموعة أمان الشبكة (NSG)، راجع مقالتصفية نسبة استخدام الشبكة باستخدام مجموعات أمان الشبكة.
افتح جدار حماية Windows للسماح لـ Azure Database Migration Service بالوصول إلى خادم PostgreSQL المصدر، والذي يكون منفذ TCP 5432 افتراضيًا.
عند استخدام جهاز جدار الحماية أمام قاعدة (قواعد) البيانات المصدر، قد تحتاج إلى إضافة قواعد جدار الحماية للسماح إلى Azure Database Migration Service بالوصول إلى قاعدة (قواعد) البيانات المصدرة للترحيل.
إنشاء قاعدة جدار حماية على مستوى الملقم من أجل Azure Database لـ PostgreSQL للسماح إلى Azure Database Migration Service بالوصول إلى قواعد البيانات المستهدفة. توفير نطاق الشبكة الفرعية للشبكة الظاهرية المستخدمة لـ Azure Database Migration Service.
هناك طريقتا استدعاء CLI:
في الزاوية العلوية اليمنى من مدخل Azure، حدد زر «Cloud Shell»:
قم بتثبيت وتشغيل CLI محليًا. يلزم إصدار CLI 2.18 أو أعلى من أداة سطر الأوامر من أجل إدارة موارد Azure المطلوبة لهذا الترحيل.
لتحميل CLI، اتبع الإرشادات الواردة في المقالة «Install Azure CLI». تسرد المقالة أيضًا الأنظمة الأساسية التي تدعم Azure CLI.
لـ «set up Windows Subsystem for Linux (WSL)»، اتبع التعليمات في «Windows 10 Installation Guide»
تمكين النسخ المتماثل المنطقي على خادم المصدر، عن طريق تحرير ملف postgresql.config وإعداد المعلمات التالية:
- wal_level = منطقي
- max_replication_slots = [عدد الفتحات]، نوصي بضبط الإعداد إلى خمس فتحات
- max_wal_senders =[عدد المهام المتزامنة] - تعين معلمة max_wal_senders عدد المهام المتزامنة التي يمكن تشغيلها، والتوصية بإعدادها إلى 10 مهام
ترحيل مخطط النموذج
لاستكمال جميع كائنات قاعدة البيانات مثل مخططات الجدول والفهارس والإجراءات المخزنة، نحتاج إلى استخراج المخطط من قاعدة البيانات المصدر وتطبيقه على قاعدة البيانات.
استخدم الأمر «pg_dump-s» لإنشاء ملف تفريغ المخطط لقاعدة بيانات.
pg_dump -O -h hostname -U db_username -d db_name -s > your_schema.sql
على سبيل المثال، لتفريغ قاعدة بيانات dvdrental ملف المخطط:
pg_dump -O -h localhost -U postgres -d dvdrental -s > dvdrentalSchema.sql
لمزيد من المعلومات حول استخدام الأداة المساعدة pg_dump، راجع الأمثلة في البرنامج التعليمي pg-dump.
إنشاء قاعدة بيانات فارغة في البيئة الهدف الخاص بك، وهو قاعدة بيانات Azure لـ PostgreSQL.
للحصول على تفاصيل حول كيفية الاتصال وإنشاء قاعدة بيانات، راجع مقالة إنشاء Azure Database لخادم PostgreSQL في مدخل Azure أو إنشاء Azure Database لخادم PostgreSQL - Hyperscale (Citus) في مدخل Azure.
استيراد المخطط إلى قاعدة البيانات المستهدفة الذي قمت بإنشائها عن طريق استعادة ملف المخطط الاحتياطي.
psql -h hostname -U db_username -d db_name < your_schema.sql
على سبيل المثال:
psql -h mypgserver-20170401.postgres.database.azure.com -U postgres -d dvdrental < dvdrentalSchema.sql
إشعار
تتعامل خدمة الترحيل داخليًّا مع تمكين/ تعطيل المفاتيح والمشغلات الخارجية لضمان ترحيل بيانات موثوق وقوي. ونتيجة لذلك، لا داعي للقلق بشأن إجراء أي تعديلات على مخطط قاعدة البيانات الهدف.
توفير مثيل DMS باستخدام Azure CLI
تثبيت ملحق مزامنة dms:
قم بتسجيل الدخول إلى Azure باستخدام الأمر التالي:
az login
عند المطالبة بذلك، افتح مستعرض ويب وأدخل رمزًا لمصادقة جهازك. اتبع الإرشادات كما هو موضح.
ترحيل PostgreSQL عبر الإنترنت متوفر الآن خلال حزمة CLI العادية (إصدار 2.18.0 وأعلى) دون الحاجة إلى ملحق
dms-preview
. إذا قمت بتثبيت الملحق في الماضي، يمكنك إزالته باستخدام الخطوات التالية:للتحقق مما إذا كان لديك ملحق
dms-preview
لتثبيته بالفعل، قم بتشغيل الأمر التالي:az extension list -o table
إذا تم تثبيت
dms-preview
الملحق، ثم تم إلغاء التثبيت، فقم بتنفيذ الأمر التالي:az extension remove --name dms-preview
للتحقق من إلغاء تثبيت
dms-preview
الملحق بشكل صحيح، قم بتشغيل الأمر التالي ويجب ألا تشاهدdms-preview
الملحق في القائمة:az extension list -o table
هام
dms-preview
قد لا تزال هناك حاجة إلى ملحق مسارات الترحيل الأخرى المدعومة من Azure DMS. الرجاء التحقق من وثائق مسار الترحيل المحدد لتحديد ما إذا كانت هناك حاجة إلى الملحق. تغطي هذه الوثائق متطلبات الملحق، خاصةً إلى PostgreSQL وAzure Database من أجل PostgreSQL عبر الإنترنت.في أي وقت، عرض كافة الأوامر المدعومة في DMS عن طريق التشغيل:
az dms -h
إذا كان لديك العديد من اشتراكات Azure، فقم بتشغيل الأمر التالي لتعيين الاشتراك الذي تريد استخدامه لتوفير مثيل خدمة DMS.
az account set -s 97181df2-909d-420b-ab93-1bff15acb6b7
توفير مثيل DMS بواسطة تشغيل الأمر التالي:
az dms create -l <location> -n <newServiceName> -g <yourResourceGroupName> --sku-name Premium_4vCores --subnet/subscriptions/{vnet subscription id}/resourceGroups/{vnet resource group}/providers/Microsoft.Network/virtualNetworks/{vnet name}/subnets/{subnet name} –tags tagName1=tagValue1 tagWithNoValue
على سبيل المثال، سوف يقوم الأمر التالي بإنشاء خدمة في:
- الموقع: شرق US2
- الاشتراك: 97181df2-909d-420b-ab93-1bff15acb6b7
- اسم مجموعة الموارد: PostgresDemo
- اسم خدمة DMS: PostgresCLI
az dms create -l eastus2 -g PostgresDemo -n PostgresCLI --subnet /subscriptions/97181df2-909d-420b-ab93-1bff15acb6b7/resourceGroups/ERNetwork/providers/Microsoft.Network/virtualNetworks/AzureDMS-CORP-USC-VNET-5044/subnets/Subnet-1 --sku-name Premium_4vCores
يستغرق حوالي 10-12 دقيقة لإنشاء مثيل خدمة DMS.
لتعريف عنوان IP عامل DMS بحيث يمكنك إضافته إلى ملف Postgres pg_hba.conf، قم بتشغيل الأمر التالي:
az network nic list -g <ResourceGroupName>--query '[].ipConfigurations | [].privateIpAddress'
على سبيل المثال:
az network nic list -g PostgresDemo --query '[].ipConfigurations | [].privateIpAddress'
يجب أن تحصل على نتيجة مشابهة للعنوان التالي:
[ "172.16.136.18" ]
إضافة عنوان IP لعامل DMS إلى ملف Postgres pg_hba.conf.
يحيط علمًا بعنوان DMS IP بعد الانتهاء من توفيره في DMS.
إضافة عنوان IP إلى ملف pg_hba.conf على المصدر، المشابهة إلى الإدخال التالي:
host all all 172.16.136.18/10 md5 host replication postgres 172.16.136.18/10 md5
بعد ذلك، إنشاء مشروع ترحيل PostgreSQL عن طريق تشغيل الأمر التالي:
az dms project create -l <location> -g <ResourceGroupName> --service-name <yourServiceName> --source-platform PostgreSQL --target-platform AzureDbforPostgreSQL -n <newProjectName>
على سبيل المثال، يقوم الأمر التالي بإنشاء مشروع باستخدام هذه المعلمات:
- الموقع: غرب وسط الولايات المتحدة
- اسم مجموعة الموارد: PostgresDemo
- اسم الخدمة: PostgresCLI
- اسم المشروع: PGMigration
- نظام الأساسي للمصدر: PostgreSQL
- النظام الأساسي المستهدف: AzureDbForPostgreSql
az dms project create -l westcentralus -n PGMigration -g PostgresDemo --service-name PostgresCLI --source-platform PostgreSQL --target-platform AzureDbForPostgreSql
إنشاء مهمة ترحيل PostgreSQL باستخدام الخطوات التالية.
تتضمن هذه الخطوة استخدام «source IP وUserID وpassword و destination IP و UserID وpassword وtask type » للاتصال.
لمشاهدة قائمة كاملة من الخيارات، قم بتشغيل الأمر:
az dms project task create -h
بالنسبة إلى كل من اتصال المصدر والاتصال المستهدف، تشير معلمة الإدخال إلى ملف json يحتوي على قائمة الكائنات.
تنسيق كائن JSON الاتصال لاتصالات PostgreSQL.
{ // if this is missing or null, you will be prompted "userName": "user name", // if this is missing or null (highly recommended) you will be prompted "password": null, "serverName": "server name", // if this is missing, it will default to the 'postgres' database "databaseName": "database name", // if this is missing, it will default to 5432 "port": 5432 }
هناك أيضًا «ملف json» كخيار قاعدة بيانات يدرج كائنات json. لـ PostgreSQL، يظهر تنسيق خيارات قاعدة بيانات كائن JSON أدناه:
[ { "name": "source database", "target_database_name": "target database", "selectedTables": [ "schemaName1.tableName1", ...n ] }, ...n ]
لإنشاء json اتصال المصدر، قم بفتح المفكرة ونسخ json التالية ولصقه في الملف. حفظ الملف في C:\DMS\source.js بعد تعديله وفقًا لخادم المصدر.
{ "userName": "postgres", "password": null, "serverName": "13.51.14.222", "databaseName": "dvdrental", "port": 5432 }
لإنشاء json الاتصال المستهدف، قم بفتح مفكرة التدوين ونسخ json التالية ولصقه في الملف. حفظ الملف في C:\DMS\target.js بعد تعديله وفقًا لخادمك المستهدف.
{ "userName": " dms@builddemotarget", "password": null, "serverName": " builddemotarget.postgres.database.azure.com", "databaseName": "inventory", "port": 5432 }
إنشاء خيارات قاعدة بيانات ملف json يسرد المخزون وتعيين قواعد البيانات للترحيل:
إنشاء قائمة بالجداول التي سيتم ترحيلها أو يمكنك استخدام استعلام SQL لإنشاء القائمة من قاعدة البيانات المصدر. يُقدم الاستعلام عن النموذج لإنشاء قائمة الجداول أدناه فقط كمثال. إذا كنت تستخدم هذا الاستعلام، يرجى تذكر إزالة الفاصلة الأخيرة في نهاية اسم الجدول الأخير لتصبح صفيف JSON ساريًا.
SELECT FORMAT('%s,', REPLACE(FORMAT('%I.%I', schemaname, tablename), '"', '\"')) AS SelectedTables FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema');
إنشاء ملف json خيارات قاعدة البيانات مع إدخال واحد لكل قاعدة بيانات مع المصدر وأسماء قاعدة البيانات الهدف وقائمة الجداول المحددة ليتم ترحيلها. يمكنك استخدام مخرجات الاستعلام عن SQL أعلاه لملء صفيف "selectedTables". يرجى ملاحظة أنه إذا كانت قائمة الجداول المحددة فارغة، فستتضمن الخدمة كافة جداول الترحيل التي تحتوي على مخطط مطابق وأسماء الجداول.
[ { "name": "dvdrental", "target_database_name": "dvdrental", "selectedTables": [ "schemaName1.tableName1", "schemaName1.tableName2", ... "schemaNameN.tableNameM" ] }, ... n ]
تشغيل الأمر التالي الذي يتم في اتصال المصدر والاتصال المستهدف وملفات json لخيارات قاعدة البيانات.
az dms project task create -g PostgresDemo --project-name PGMigration --source-connection-json c:\DMS\source.json --database-options-json C:\DMS\option.json --service-name PostgresCLI --target-connection-json c:\DMS\target.json --task-type OnlineMigration -n runnowtask
عند هذه النقطة، لقد قدمت بنجاح مهمة الترحيل.
لعرض التقدم المحرز في المهمة، قم بتشغيل الأمر التالي:
للاطلاع على حالة المهمة العامة باختصار
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
للاطلاع على حالة المهمة التفصيلية، بما في ذلك معلومات تقدم الترحيل
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask --expand output
يمكنك أيضا استخدام تنسيق استعلام JMESPath لاستخراج migrationState فقط من إخراج التوسيع:
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask --expand output --query 'properties.output[].migrationState'
في الإخراج، هناك العديد من المعلمات التي تشير إلى تقدم خطوات الترحيل المختلفة. على سبيل المثال، راجع المخرجات أدناه:
{ "output": [ // Database Level { "appliedChanges": 0, // Total incremental sync applied after full load "cdcDeleteCounter": 0, // Total delete operation applied after full load "cdcInsertCounter": 0, // Total insert operation applied after full load "cdcUpdateCounter": 0, // Total update operation applied after full load "databaseName": "inventory", "endedOn": null, "fullLoadCompletedTables": 2, //Number of tables completed full load "fullLoadErroredTables": 0, //Number of tables that contain migration error "fullLoadLoadingTables": 0, //Number of tables that are in loading status "fullLoadQueuedTables": 0, //Number of tables that are in queued status "id": "db|inventory", "incomingChanges": 0, //Number of changes after full load "initializationCompleted": true, "latency": 0, //Status of migration task "migrationState": "READY_TO_COMPLETE", //READY_TO_COMPLETE => the database is ready for cutover "resultType": "DatabaseLevelOutput", "startedOn": "2018-07-05T23:36:02.27839+00:00" }, { "databaseCount": 1, "endedOn": null, "id": "dd27aa3a-ed71-4bff-ab34-77db4261101c", "resultType": "MigrationLevelOutput", "sourceServer": "138.91.123.10", "sourceVersion": "PostgreSQL", "startedOn": "2018-07-05T23:36:02.27839+00:00", "state": "PENDING", "targetServer": "builddemotarget.postgres.database.azure.com", "targetVersion": "Azure Database for PostgreSQL" }, // Table 1 { "cdcDeleteCounter": 0, "cdcInsertCounter": 0, "cdcUpdateCounter": 0, "dataErrorsCount": 0, "databaseName": "inventory", "fullLoadEndedOn": "2018-07-05T23:36:20.740701+00:00", //Full load completed time "fullLoadEstFinishTime": "1970-01-01T00:00:00+00:00", "fullLoadStartedOn": "2018-07-05T23:36:15.864552+00:00", //Full load started time "fullLoadTotalRows": 10, //Number of rows loaded in full load "fullLoadTotalVolumeBytes": 7056, //Volume in Bytes in full load "id": "or|inventory|public|actor", "lastModifiedTime": "2018-07-05T23:36:16.880174+00:00", "resultType": "TableLevelOutput", "state": "COMPLETED", //State of migration for this table "tableName": "public.catalog", //Table name "totalChangesApplied": 0 //Total sync changes that applied after full load }, //Table 2 { "cdcDeleteCounter": 0, "cdcInsertCounter": 50, "cdcUpdateCounter": 0, "dataErrorsCount": 0, "databaseName": "inventory", "fullLoadEndedOn": "2018-07-05T23:36:23.963138+00:00", "fullLoadEstFinishTime": "1970-01-01T00:00:00+00:00", "fullLoadStartedOn": "2018-07-05T23:36:19.302013+00:00", "fullLoadTotalRows": 112, "fullLoadTotalVolumeBytes": 46592, "id": "or|inventory|public|address", "lastModifiedTime": "2018-07-05T23:36:20.308646+00:00", "resultType": "TableLevelOutput", "state": "COMPLETED", "tableName": "public.orders", "totalChangesApplied": 0 } ], // DMS migration task state "state": "Running", //Running => service is still listening to any changes that might come in "taskType": null }
مهمة ترحيل الانتقال
قاعدة البيانات جاهزة للانتقال عند استكمال التحميل بالكامل. اعتمادًا على مدى انشغال الخادم المصدر بالمعاملات الجديدة، قد تكون مهمة DMS لا تزال تقوم بالتغيير بعد اكتمال التحميل الكامل.
لضمان التقاط كافة البيانات، تحقق من صحة عدد الصفوف بين قواعد البيانات المصدر والمستهدفة. على سبيل المثال، يمكنك التحقق من التفاصيل التالية من مخرجات الحالة:
Database Level
"migrationState": "READY_TO_COMPLETE" => Status of migration task. READY_TO_COMPLETE means database is ready for cutover
"incomingChanges": 0 => Check for a period of 5-10 minutes to ensure no new incoming changes need to be applied to the target server
Table Level (for each table)
"fullLoadTotalRows": 10 => The row count matches the initial row count of the table
"cdcDeleteCounter": 0 => Number of deletes after the full load
"cdcInsertCounter": 50 => Number of inserts after the full load
"cdcUpdateCounter": 0 => Number of updates after the full load
تنفيذ مهمة ترحيل قاعدة بيانات الانتقال باستخدام الأمر التالي:
az dms project task cutover -h
على سبيل المثال، سوف يبدأ انتقال الأمر التالي من أجل قاعدة بيانات 'Inventory':
az dms project task cutover --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask --object-name Inventory
لمراقبة التقدم المحرز في الانتقال، قم بتشغيل الأمر التالي:
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
عندما تظهر حالة ترحيل قاعدة البيانات «Completed»، قم بإعادة إنشاء التسلسلات (إن أمكن)، ثم قم بتوصيل التطبيقات الخاصة بك بالمثيل المستهدف الجديد من Azure Database لـ PostgreSQL.
تنظيف المهام والمشروع والخدمة
إذا كنت بحاجة إلى إلغاء أو حذف أي مهمة أو مشروع أو خدمة DMS، قم بالإلغاء بالترتيب التالي:
- «Cancel any running task»
- «Delete the task»
- «Delete the project»
- «Delete DMS service»
لإلغاء مهمة قيد التشغيل، استخدم الأمر التالي:
az dms project task cancel --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
لحذف مهمة قيد التشغيل، استخدم الأمر التالي:
az dms project task delete --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
لحذف مشروع، استخدم الأمر التالي:
az dms project delete -n PGMigration -g PostgresDemo --service-name PostgresCLI
لحذف خدمة DMS، استخدم الأمر التالي:
az dms delete -g ProgresDemo -n PostgresCLI
الخطوات التالية
- للحصول على معلومات حول المشكلات والقيود المعروفة عند تنفيذ عمليات الترحيل عبر الإنترنت إلى Azure Database لـ PostgreSQL، راجع مقالة المشكلات المعروفة والحلول البديلة باستخدام Azure Database لعمليات ترحيل PostgreSQL عبر الإنترنت.
- للحصول على معلومات حول Azure Database Migration Service، راجع مقالة ما المقصود بـ Azure Database Migration Service ؟.
- للحصول على معلومات حول Azure Database for PostgreSQL، راجع المقالة ما هي Azure Database for PostgreSQL؟.