تمرين: قم بترحيل قاعدة بيانات PostgreSQL المحلية إلى Azure Database for PostgreSQL

مكتمل

في هذا التمرين، ستقوم بترحيل قاعدة بيانات PostgreSQL إلى Azure. ستقوم بترحيل قاعدة بيانات PostgreSQL موجودة تعمل على جهاز ظاهري إلى Azure Database for PostgreSQL.

بصفتك مطور لقاعدة بيانات لدى مؤسسة AdventureWorks. تقوم شركة AdventureWorks ببيع الدراجات وقطع غيارها مباشرة إلى المستهلك النهائي والموزعين لأكثر من عقد من الزمان. تخزن أنظمتها المعلومات في قاعدة بيانات يتم تشغيلها حاليًا باستخدام PostgreSQL على الجهاز الظاهري لـ Azure. وكجزء من عملية ترشيد الأجهزة، يُراد في AdventureWorks نقل قاعدة البيانات إلى قاعدة بيانات مُدارة بخدمات Azure. طُلِب منك إجراء هذا الترحيل.

هام

خدمة ترحيل بيانات Azure غير مدعومة في بيئة Azure sandbox المجانية. يمكنك تنفيذ هذه الخطوات في الاشتراك الشخصي الخاص بك، أو الاكتفاء بالمتابعة لفهم كيفية ترحيل قاعدة بياناتك.

إعداد البيئة

قم بتشغيل أوامر Azure CLI هذه في Cloud Shell لإنشاء جهاز ظاهري، بتشغيل PostgreSQL، مع نسخة من قاعدة بيانات adventureworks. تُنفِذ الأوامر الأخيرة طباعة عنوان IP للجهاز الظاهري الجديد.

az account list-locations -o table

az group create \
    --name migrate-postgresql \
    --location <CHOOSE A LOCATION FROM ABOVE NEAR YOU>

az vm create \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --admin-username azureuser \
    --admin-password Pa55w.rdDemo \
    --image Ubuntu2204 \
    --public-ip-address-allocation static \
    --public-ip-sku Standard \
    --vnet-name postgresqlvnet \
    --nsg ""

az vm run-command invoke \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --command-id RunShellScript \
    --scripts "
# Install PostgreSQL
sudo echo deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main > /etc/apt/sources.list.d/pgdg.list
sudo wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get -y update
sudo apt-get -y install postgresql-10
# Clone exercise code
sudo git clone https://github.com/MicrosoftLearning/DP-070-Migrate-Open-Source-Workloads-to-Azure.git /home/azureuser/workshop    
# Configure PostgreSQL
sudo service postgresql stop
sudo bash << EOF
    printf \"listen_addresses = '*'\nwal_level = logical\nmax_replication_slots = 5\nmax_wal_senders = 10\n\" >> /etc/postgresql/10/main/postgresql.conf
    printf \"host    all             all             0.0.0.0/0               md5\n\" >> /etc/postgresql/10/main/pg_hba.conf
EOF
sudo service postgresql start

# Add the azureuser role and adventure works
sudo bash << EOF
su postgres << EOC
printf \"create role azureuser with login;alter role azureuser createdb;alter role azureuser password 'Pa55w.rd';alter role azureuser superuser;create database adventureworks;grant all privileges on database adventureworks to azureuser; \" | psql
EOC
EOF

PGPASSWORD=Pa55w.rd psql -h localhost -U azureuser adventureworks -E -q -f /home/azureuser/workshop/migration_samples/setup/postgresql/adventureworks/adventureworks.sql
"

az vm open-port \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --priority 200 \
    --port '22'

az vm open-port \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --priority 300 \
    --port '5432'

echo Setup Complete

SQLIP="$(az vm list-ip-addresses \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
    --output tsv)"

echo $SQLIP

يستغرق اكتمال هذه الأوامر تقريبًا 5 دقائق. لست بحاجة إلى الانتظار، يمكنك متابعة الخطوات أدناه.

إنشاء خادم مرن لقاعدة بيانات Azure ل PostgreSQL

  1. باستخدام متصفح الويب، افتح علامة تبويب جديدة وانتقل إلى مدخل Microsoft Azure.

  2. في شريط البحث، اكتب قاعدة بيانات Azure لخوادم PostgreSQL المرنة.

  3. في صفحة خوادم Azure Database for PostgreSQL المرنة، حدد + Create.

  4. في صفحة Flexible server ، أدخل التفاصيل التالية، ثم حدد Review + create:

    الخاصية القيمة
    مجموعة الموارد ترحيل-postgresql
    اسم الخادم adventureworksnnn، حيث تمثل nnn لاحقة من اختيارك تمييز اسم الخادم
    الموقع اختر أقرب موقع لك
    إصدار PostgreSQL 13
    الحوسبة + التخزين حدد تهيئة خادموحدد مستوى الأسعار الأساسي، ثم حدد موافق
    اسم المستخدم المسؤول awadmin
    كلمة المرور Pa55w.rdDemo
    تأكيد كلمة المرور Pa55w.rdDemo
  5. في صفحة مراجعة+ إنشاء حدد إنشاء. انتظر حتى يتم إنشاء الخدمة قبل المواصلة.

  6. بعد إنشاء المورد، حدد التوجُّه إلى المورد.

  7. حدد أمان الاتصال.

  8. في صفحة Connection security، قم بتعيين Allow access to Azure services إلى Yes.

  9. في قائمة قواعد جدار الحماية، قم بإضافة قاعدة باسم VM، ثم قم بتعيين START IP ADDRESS وEND IP ADDRESS إلى عنوان IP للجهاز الظاهري الذي يقوم بتشغيل خادم PostgreSQL الذي قمت بإنشائه سابقًا.

  10. حدد Add current client IP address، لتمكين جهاز العميل من الاتصال بقاعدة البيانات.

  11. اضغط حفظ، وانتظر لحين تحديث قواعد جدار الحماية.

  12. في موجه Cloud Shell، قم بتشغيل الأمر التالي لإنشاء قاعدة بيانات جديدة في خدمة Azure Database for PostgreSQL. قم باستبدال [nnn] باللاحقة التي استخدمتها عند إنشاء خدمة Azure Database for PostgreSQL. استبدال [resource group] باسم مجموعة الموارد التي حددتها للخدمة:

    az postgres flexible-server create \
      --name azureadventureworks \
      --resource-group migrate-postgresql
    

    إذا تم إنشاء قاعدة البيانات بنجاح، ينبغي أن تشاهد رسالة مشابهة للرسالة التالية:

    {
      "charset": "UTF8",
      "collation": "English_United States.1252",
      "name": "azureadventureworks",
      "resourceGroup": "migrate-postgresql",
      "type": "Microsoft.DBforPostgreSQL/servers/databases"
    }
    

تصدير المخطط لاستخدامه في قاعدة البيانات الهدف

عليك الآن الاتصال بالجهاز الظاهري لـ PostgreSQL الحالي باستخدام Cloud Shell لتصدير مخطط قاعدة البيانات.

  1. قم بتشغيل أمر CLI Azure هذا لمشاهدة عنوان IP الخاص بالجهاز الظاهري القائم.

    SQLIP="$(az vm list-ip-addresses \
        --resource-group migrate-postgresql \
        --name postgresqlvm \
        --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
        --output tsv)"
    
    echo $SQLIP
    
  2. اتصل بخادم قاعدة البيانات القديم باستخدام SSH. أدخل Pa55w.rdDemo لكلمة المرور.

    ssh azureuser@$SQLIP
    
  3. قم بتشغيل الأمر التالي للاتصال بقاعدة البيانات على الجهاز الظاهري. كلمة مرور المستخدم azureuser في خادم PostgreSQL الذي يعمل على الجهاز الظاهري هي Pa55w.rd:

    psql adventureworks
    
  4. منح إذن النسخ المتماثل لـ azureuser:

    ALTER ROLE azureuser REPLICATION;
    
  5. أغلق الأداة المساعدة psql باستخدام الأمر \q.

  6. في موجه bash، قم بتشغيل الأمر التالي لتصدير مخطط قاعدة بيانات adventureworks إلى ملف يُسمى adventureworks_schema.sql

    pg_dump -o  -d adventureworks -s > adventureworks_schema.sql
    

استيراد المخطط إلى قاعدة البيانات الهدف

  1. قم بتشغيل الأمر التالي للاتصال بخادم azureadventureworks [nnn]. استبدل مثيلي [nnn] بلاحقة الخدمة. لاحظ أن اسم المستخدم له لاحقة @adventureworks[nnn]. في موجه كلمة المرور، أدخل Pa55w.rdDemo.

    psql -h adventureworks[nnn].postgres.database.azure.com -U awadmin@adventureworks[nnn] -d postgres
    
  2. قم بتشغيل الأوامر التالية لإنشاء مستخدم باسم azureuser وتعيين كلمة المرور لهذا المستخدم إلى Pa55w.rd. تمنح العبارة الثالثة مستخدم azureuser الامتيازات الضرورية لإنشاء الكائنات وإدارتها في قاعدة بيانات azure ventureworks. يمكّن الدور azure_pg_admin المستخدم azureuser لتثبيت الملحقات في قاعدة البيانات واستخدامها.

    CREATE ROLE azureuser WITH LOGIN;
    ALTER ROLE azureuser PASSWORD 'Pa55w.rd';
    GRANT ALL PRIVILEGES ON DATABASE azureadventureworks TO azureuser;
    GRANT azure_pg_admin TO azureuser;
    
  3. أغلق الأداة المساعدة psql باستخدام الأمر \q.

  4. قم باستيراد مخطط قاعدة بيانات adventureworks إلى قاعدة بيانات azure ventureworks التي تعمل على خدمة Azure Database for PostgreSQL. تقوم بإجراء عملية الاستيراد كـ azureuser، لذا أدخل كلمة المرور Pa55w.rd عندما يُطلب منك ذلك.

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -E -q -f adventureworks_schema.sql
    

    سترى سلسلة من الرسائل عند إنشاء كل عنصر. يجب إكمال البرنامج النصي دون أي أخطاء.

  5. قم بتشغيل الأمر التالي. يقوم البرنامج النصي findkeys.sql بإنشاء برنامج نصي SQL آخر باسم dropkeys.sql والذي سيزيل جميع المفاتيح الخارجية من الجداول في قاعدة بيانات azure ventureworks. سيتم تشغيل البرنامج النصي dropkeys.sql قريبًا:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/findkeys.sql -o dropkeys.sql -t
    
  6. قم بتشغيل الأمر التالي. يقوم البرنامج النصي .sql createkeys بإنشاء برنامج نصي SQL آخر باسم addkeys.sql والذي سيزيل جميع المفاتيح الخارجية. سيتم تشغيل البرنامج النصي addkeys.sql بعد ترحيل قاعدة البيانات:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/createkeys.sql -o addkeys.sql -t
    
  7. قم بتشغيل البرنامج النصي dropkeys.sql:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f dropkeys.sql
    

    سترى سلسلة رسائل ALTER TABLE معروضة، حيث يتم إسقاط المفاتيح الخارجية.

  8. قم بإحصاء الأداة المساعدة psql مرة أخرى واتصل بقاعدة بيانات azureadventureworks.

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
    
  9. قم بتشغيل الاستعلام التالي للعثور على تفاصيل أي مفاتيح خارجية متبقية:

    SELECT constraint_type, table_schema, table_name, constraint_name
    FROM information_schema.table_constraints
    WHERE constraint_type = 'FOREIGN KEY';
    

    يجب أن يُرجع هذا الاستعلام مجموعة نتائج فارغة. ومع ذلك، إذا استمر وجود أي مفاتيح خارجية، فقم بتشغيل الأمر التالي لكل مفتاح خارجي:

    ALTER TABLE [table_schema].[table_name] DROP CONSTRAINT [constraint_name];
    
  10. بعد إزالة أي مفاتيح خارجية متبقية، قم بإجراء عبارة SQL التالية لعرض المشغلات في قاعدة البيانات:

    SELECT trigger_name
    FROM information_schema.triggers;
    

    يجب أن يُرجع هذا الاستعلام أيضًا مجموعة نتائج فارغة، ما يشير إلى أن قاعدة البيانات لا تحتوي على مشغلات. إذا كانت قاعدة البيانات تحتوي على مشغلات، يجب عليك تعطيلها قبل ترحيل البيانات، وإعادة تمكينها بعد ذلك.

  11. أغلق الأداة المساعدة psql باستخدام الأمر \q.

إجراء ترحيل عبر الإنترنت باستخدام خدمة ترحيل قاعدة البيانات

  1. ارجع إلى بوابة Azure.

  2. حدد All services، وحدد Subscriptions، ثم حدد الاشتراك.

  3. في صفحة الاشتراك، ضِمن قِسم الإعدادات، حدِد مُقدِمي الموارد.

  4. في المربع تصفية حسب الاسم، اكتب DataMigration، ثم حدد Microsoft.DataMigration.

  5. إذا لم يتم تسجيل Microsoft.DataMigration، حدد Register، وانتظر حتى يتم تغيير Status إلى Registered. قد يكون من الضروري تحديد Refresh لرؤية تغيير الحالة.

  6. حدد إعداد مورد، في المربع البحث عن السوق، واكتب خدمة ترحيل قاعدة بيانات Azure، ثم اضغط إدخال.

  7. في صفحة خدمة خدمة ترحيل قاعدة بيانات Azure، حدد إنشاء.

  8. في صفحة إنشاء خدمة ترحيل أدخل التفاصيل التالية، ثم حدد التالي: الشبكة>>.

    الخاصية القيمة
    تحديد مجموعة موارد ترحيل-postgresql
    اسم الخدمة adventureworks_migration_service
    الموقع اختر أقرب موقع لك
    وضع الخدمة Azure
    مستوى الأسعار متميز، مع 4 ذاكرات أساسية ظاهرية
  9. في صفحة Networking، حدد الشبكة الظاهرية لـ postgresqlvnet/posgresqlvmSubnet. تم إنشاء هذه الشبكة كجزء من الإعداد.

  10. حدد مراجعة + إنشاء، ثم حدد إنشاء. انتظر في أثناء إنشاء خدمة Database Migration Service. ستستغرق هذه العملية بضع دقائق.

  11. بعد إنشاء المورد، حدد التوجُّه إلى المورد.

  12. حدد New Migration Project.

  13. في صفحة مشروع ترحيل جديد، أدخِل التفاصيل التالية، ثم حدد إنشاء نشاط وتشغيله.

    الخاصية القيمة
    اسم المشروع adventureworks_migration_project
    نوع خادم المصدر PostgreSQL
    Target Database for PostgreSQL Azure Database for PostgreSQL
    اختر نوع النشاط ترحيل البيانات عبر الإنترنت
  14. عند بدء تشغيل Migration Wizard في صفحة Select source أدخل التفاصيل التالية، ثم حدد Next: Select target>> .

    الخاصية القيمة
    اسم الخادم المصدر nn.nn.nn.nn (عنوان IP الخاص بالجهاز الظاهري Azure الذي يقوم بتشغيل PostgreSQL)
    منفذ الخادم 5432
    قاعدة بيانات adventureworks
    اسم المستخدم azureuser
    كلمة المرور Pa55w.rd
    الوثوق بشهادة خادم الثقة محدد
    ‏تشفير الاتصال محدد
  15. في صفحة Select target، أدخل التفاصيل التالية، ثم حدد Next: Select databases>>.

    الخاصية القيمة
    Azure PostgreSQL adventureworks[nnn]
    قاعدة بيانات azureadventureworks
    اسم المستخدم azureuser@adventureworks[nnn]
    كلمة المرور Pa55w.rd
  16. في صفحة Select databases، حدد قاعدة بيانات adventureworks وتعيينها إلى azure ventureworks. إلغاء تحديد قاعدة بيانات postgres. حدد التالي>>.

  17. في صفحة Select tables، حدد Next: Configure migration settings>>.

  18. في الصفحة Configure migration settings، قم بتوسيع القائمة المنسدلة adventureworks، وقم بتوسيع Advanced online migration settings dropdown، وتحقق من أن Maximum number of instances to load in parallel يتم تعيينه إلى 5، ثم حدد Next: Summary>>.

  19. في صفحة Summary في المربع Activity name، واكتب AdventureWorks_Migration_Activity، ثم حدد Start migration.

  20. في صفحة AdventureWorks_Migration_Activity، ثم حدد Refresh عند فواصل زمنية ثانية 15. سترى حالة عملية الترحيل أثناء تقدمها. انتظر حتى يتغير عمود تفاصيل الترحيل إلى جاهزية النقل (من القديم إلى الجديد).

  21. قم بالتبديل مرة أخرى إلى Cloud Shell.

  22. قم بتشغيل الأمر التالي لإعادة إنشاء المفاتيح الخارجية في قاعدة بيانات azure ventureworks. لقد أنشأت البرنامج النصي .sql addkeys سابقًا:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f addkeys.sql
    

    سترى سلسلة من العبارات ALTER TABLE كما يتم إضافة المفاتيح الخارجية. قد ترى خطأ بخصوص الجدول SpecialOfferProduct والذي يمكنك تجاهله الآن. هذا بسبب قيود UNIQUE والتي لا يتم نقلها بشكل صحيح. في الحياة الواقعية، يجب عليك استرداد تفاصيل هذا القيد من قاعدة البيانات المصدر باستخدام الاستعلام التالي:

    SELECT constraint_type, table_schema, table_name, constraint_name
    FROM information_schema.table_constraints
    WHERE constraint_type = 'UNIQUE';
    

    يمكنك بعد ذلك إعادة هذا القيد يدويًا في قاعدة البيانات الهدف في Azure Database for PostgreSQL.

    يجب ألا تكون هناك أخطاء أخرى.

تعديل البيانات، وقطع إلى قاعدة بيانات جديدة

  1. ارجع إلى صفحة AdventureWorks_Migration_Activity في مدخل Microsoft Azure.

  2. حدد قاعدة بيانات adventureworks.

  3. في صفحة adventureworks، تحقق من أن قيمة Full load completed تكون 66 وأن جميع القيم الأخرى تكون 0.

  4. قم بالتبديل مرة أخرى إلى Cloud Shell.

  5. قم بتشغيل الأمر التالي للاتصال بقاعدة بيانات adventureworks والتي تعمل باستخدام PostgreSQL على الجهاز الظاهري:

    psql adventureworks
    
  6. قم بإجراء عبارات SQL التالية لعرضها، ثم قم بإزالة الطلبات 43659 و43660 و43661 من قاعدة البيانات. لاحظ أن قاعدة البيانات بإجراء عملية حذف متتالٍ في جدول salesorderheader، والتي تحذف تلقائيًا الصفوف المقابلة من جدول salesorderdetail.

    SELECT * FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    SELECT * FROM sales.salesorderdetail WHERE salesorderid IN (43659, 43660, 43661);
    DELETE FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    
  7. أغلق الأداة المساعدة psql باستخدام الأمر \q.

  8. ارجع إلى صفحة adventureworks في مدخل Microsoft Azure، وحدد Refresh. تحقق من أنه تم تطبيق 32 تغييرًا.

  9. حدد Start cutover.

  10. في صفحة النقل الكُلي، حدد تأكيد، ثم حدد تطبيق. انتظر حتى تتغير الحالة إلى مكتمل.

  11. ارجع إلى Cloud Shell.

  12. قم بتشغيل الأمر التالي للاتصال بقاعدة بيانات azure ventureworks، والذي يعمل باستخدام خدمة Azure Database for PostgreSQL:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
    

    كلمة المرور هي Pa55w.rd.

  13. قم بإجراء عبارات SQL التالية لعرض الطلبات وتفاصيل الطلب في قاعدة البيانات. قم بالإنهاء بعد الصفحة الأولى من كل جدول. والغرض من هذه الاستفسارات هو إثبات مسألة نقل البيانات.

    SELECT * FROM sales.salesorderheader;
    SELECT * FROM sales.salesorderdetail;
    
  14. قم بتشغيل عبارات SQL التالية لعرض الأوامر والتفاصيل للأوامر 43659 و43660 و43661.

    SELECT * FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    SELECT * FROM sales.salesorderdetail WHERE salesorderid IN (43659, 43660, 43661);
    

    يجب أن يقوم كلا الاستعلامَين بإرجاع 0 صفوف.

  15. أغلق الأداة المساعدة psql باستخدام الأمر \q.

تنظيف الموارد التي أنشأتها

هام

إذا نفذت هذه الخطوات في الاشتراك الشخصي الخاص بك، فسيمكنك حذف الموارد بشكل فردي أو حذف مجموعة الموارد لحذف الموارد المجمعة بأكملها. الموارد المتبقية قيد التشغيل يمكن أن تكلفك المال.

  1. باستخدام Cloud Shell، قم بتشغيل هذا الأمر لحذف مجموعة الموارد:
az group delete --name migrate-postgresql