آموزش مهاجرت از mysql به postgresql با استفاده از pgLoader

آموزش مهاجرت از mysql به postgresql با استفاده از pgLoader

PostgreSQL، که به عنوان Postgres نیز شناخته می‌شود، یک سیستم مدیریت پایگاه داده رابطه‌ای متن‌باز (RDBMS) است. در سال‌های اخیر شاهد رشد چشمگیری در محبوبیت آن بوده‌ایم؛ توسعه‌دهندگان و شرکت‌های بسیاری داده‌های خود را از سایر راهکارهای پایگاه داده به Postgres مهاجرت داده‌اند.

چشم‌انداز مهاجرت یک پایگاه داده می‌تواند دلهره‌آور باشد، به‌ویژه وقتی که از یک سیستم مدیریت پایگاه داده به سیستم دیگری منتقل شوید. pgLoader یک ابزار مهاجرت پایگاه داده متن‌باز است که هدف آن ساده‌سازی فرآیند مهاجرت به PostgreSQL می‌باشد. این ابزار از مهاجرت از چندین نوع فایل و سیستم‌های مدیریت پایگاه داده (RDBMS) — از جمله MySQL و SQLite — به PostgreSQL پشتیبانی می‌کند.

این آموزش دستورالعمل‌هایی را ارائه می‌دهد تا نحوه نصب pgLoader و استفاده از آن برای مهاجرت یک پایگاه داده MySQL راه دور به PostgreSQL از طریق اتصال SSL توضیح داده شود. در انتهای این آموزش، به چند سناریوی مختلف مهاجرت که در آن‌ها pgLoader می‌تواند مفید باشد، نیز به طور مختصر اشاره خواهیم کرد.

پیش‌نیازها

برای تکمیل این آموزش، به موارد زیر نیاز دارید:

  • دسترسی به دو سرور که هر دو بر روی Ubuntu 18.04 اجرا می‌شوند. هر دو سرور باید دارای یک فایروال و یک کاربر غیر ریشه‌ای با دسترسی‌های sudo تنظیم شده باشند. برای تنظیم این موارد، می‌توانید از راهنمای «راه‌اندازی اولیه سرور در Ubuntu 18.04» استفاده کنید.
  • نصب MySQL روی یکی از سرورها. برای انجام این کار، مراحل 1، 2 و 3 راهنمای «نصب MySQL در Ubuntu 18.04» را دنبال کنید. توجه داشته باشید که برای تکمیل تمامی آموزش‌های پیش‌نیازی که در اینجا لینک شده‌اند، باید کاربر root در MySQL را طوری پیکربندی کنید که با رمز عبور احراز هویت شود، همانطور که در مرحله 3 راهنمای نصب MySQL توضیح داده شده است.
  • نصب PostgreSQL روی سرور دیگر. برای این کار، مرحله 1 راهنمای «نصب و استفاده از PostgreSQL در Ubuntu 18.04» را تکمیل کنید.
  • سرور MySQL شما باید به گونه‌ای پیکربندی شده باشد که اتصالات رمزگذاری‌شده (encrypted) را بپذیرد. برای انجام این پیکربندی، تمامی مراحل آموزش «چگونه SSL/TLS را برای MySQL در Ubuntu 18.04 پیکربندی کنیم» (شامل مرحله 6 اختیاری) را دنبال کنید. هنگام اجرای این راهنما، حتماً از سرور PostgreSQL خود به عنوان ماشین مشتری MySQL استفاده کنید، چرا که برای مهاجرت داده با pgLoader نیاز است بتوانید از ماشین Postgres به سرور MySQL متصل شوید.

لطفاً توجه داشته باشید که در طول این راهنما، سروری که MySQL را روی آن نصب کرده‌اید، به عنوان «سرور MySQL» نامیده می‌شود و دستورات مربوط به آن با پس‌زمینه آبی نمایش داده می‌شوند.

به همین ترتیب، این راهنما به سرور دیگر به عنوان «سرور PostgreSQL» یا «سرور Postgres» اشاره می‌کند و دستورات مربوط به آن با پس‌زمینه قرمز نمایش داده می‌شوند.

این نکات را هنگام دنبال کردن این آموزش در نظر داشته باشید تا از هر گونه سردرگمی جلوگیری شود.


مرحله 1- (اختیاری) ایجاد پایگاه داده و جدول نمونه در MySQL

این مرحله فرآیند ایجاد یک پایگاه داده تست و پر کردن آن با داده‌های آزمایشی (dummy data) را توضیح می‌دهد. توصیه می‌کنیم از این حالت تست برای تمرین استفاده از pgLoader بهره ببرید؛ اما اگر قبلاً پایگاه داده‌ای جهت مهاجرت دارید، می‌توانید به مرحله بعد بروید.

ابتدا، ترمینال MySQL را روی سرور MySQL خود باز کنید:

mysql -u root -p

پس از وارد کردن رمز عبور کاربر root MySQL، پرامپت MySQL ظاهر می‌شود.

سپس، با اجرای دستور زیر یک پایگاه داده جدید ایجاد کنید. می‌توانید نام دلخواهی برای پایگاه داده انتخاب کنید، اما در این راهنما نام آن را source_db در نظر می‌گیریم:

CREATE DATABASE source_db;

سپس با دستور USE به این پایگاه داده سوئیچ کنید:

USE source_db;

خروجی:

Database changed

در داخل این پایگاه داده، از دستور زیر برای ایجاد یک جدول نمونه استفاده کنید. در اینجا نام جدول را sample_table قرار می‌دهیم، اما می‌توانید نام دیگری انتخاب کنید:

CREATE TABLE sample_table (
	employee_id INT PRIMARY KEY,
	first_name VARCHAR(50),
	last_name VARCHAR(50),
	start_date DATE,
	salary VARCHAR(50)
);

سپس با استفاده از دستور زیر، جدول را با داده‌های نمونه کارمندی پر کنید:

INSERT INTO sample_table (employee_id, first_name, last_name, start_date, salary) 
VALUES (1, 'Elizabeth', 'Cotten', '2007-11-11', '$105433.18'),
       (2, 'Yanka', 'Dyagileva', '2017-10-30', '$107540.67'),
       (3, 'Lee', 'Dorsey', '2013-06-04', '$118024.04'),
       (4, 'Kasey', 'Chambers', '2010-08-18', '$116456.98'),
       (5, 'Bram', 'Tchaikovsky', '2018-09-16', '$61989.50');

پس از این کار، می‌توانید از پرامپت MySQL خارج شوید:

exit

اکنون که یک پایگاه داده نمونه با داده‌های آزمایشی ایجاد کرده‌اید، می‌توانید به مرحله بعد بروید که نصب pgLoader روی سرور PostgreSQL را شامل می‌شود.


مرحله 2-نصب pgLoader

pgLoader برنامه‌ای است که می‌تواند داده‌ها را از منابع مختلف به یک پایگاه داده PostgreSQL بارگذاری کند. این ابزار از دستور COPY در PostgreSQL برای کپی کردن داده‌ها از یک پایگاه داده یا فایل (مثلاً یک فایل CSV) به یک پایگاه داده مقصد PostgreSQL استفاده می‌کند.

pgLoader در مخازن پیش‌فرض APT اوبونتو موجود است و می‌توانید آن را با دستور apt نصب کنید. با این حال، در این راهنما قصد داریم از گزینه useSSL در pgLoader استفاده کنیم، ویژگی‌ای که امکان مهاجرت از MySQL از طریق اتصال SSL را فراهم می‌کند. این ویژگی فقط در نسخه‌های ۳.۵.۱ و جدیدتر pgLoader موجود است، در حالی که نصب از مخازن پیش‌فرض اوبونتو (در زمان نگارش این متن) نسخه ۳.۴.۱ را نصب می‌کند. بنابراین، این راهنما نحوه نصب جدیدترین نسخه pgLoader از سورس کد موجود در مخزن GitHub پروژه را توضیح می‌دهد.

قبل از نصب pgLoader، باید وابستگی‌های آن (dependencies) را نصب کنید. اگر اخیراً این کار را نکرده‌اید، ابتدا فهرست بسته‌های سرور PostgreSQL خود را به‌روزرسانی کنید:

sudo apt update

سپس بسته‌های زیر را نصب کنید:

  • sbcl: کامپایلر Common Lisp
  • unzip: ابزاری برای خارج کردن فایل‌های .zip
  • libsqlite3-dev: مجموعه‌ای از فایل‌های توسعه برای SQLite 3
  • gawk: مخفف “GNU awk”، زبان پردازش و جستجوی الگو
  • curl: ابزاری خط فرمان برای انتقال داده از یک URL
  • make: ابزاری برای مدیریت کامپایل بسته‌ها
  • freetds-dev: کتابخانه کلاینت برای پایگاه‌های داده MS SQL و Sybase
  • libzip-dev: کتابخانه‌ای برای خواندن، ایجاد و ویرایش آرشیوهای zip

برای نصب این وابستگی‌ها از دستور زیر استفاده کنید:

sudo apt install sbcl unzip libsqlite3-dev gawk curl make freetds-dev libzip-dev

هنگامی که از شما خواسته شد تا نصب این بسته‌ها را تایید کنید، کلید ENTER را فشار دهید.

سپس به صفحه Releases پروژه pgLoader در GitHub بروید و آخرین نسخه را پیدا کنید. در این راهنما از آخرین نسخه موجود در زمان نگارش این متن (نسخه ۳.۶.۲) استفاده خواهیم کرد. به منوی Assets نسخه مورد نظر بروید و لینک فایل tar.gz برچسب‌گذاری شده به عنوان Source code را کپی کنید. سپس لینک کپی‌شده را در دستور curl زیر جایگزین کنید (آدرس URL برجسته را جایگزین کنید):

curl -fsSLO https://github.com/dimitri/pgloader/archive/v3.6.2.tar.gz

cURL ابزاری خط فرمان است که در بسیاری از سیستم‌های عامل برای انتقال داده از یک URL استفاده می‌شود. این برنامه داده‌های موجود در URL مشخص شده را خوانده و در خروجی سیستم چاپ می‌کند.

این دستور curl شامل گزینه -O است که باعث می‌شود محتویات فایل به صورت محلی با همان نام فایل منبع (v3.6.2.tar.gz) ذخیره شود به جای چاپ در خروجی استاندارد. همچنین گزینه‌های -fsSL نیز به کار رفته‌اند که در مجموع به cURL می‌گویند در صورت بروز مشکل (مثلاً عدم توانایی در اتصال به GitHub) خطا را به صورت خاموش (silent) مدیریت کند و خطای حاصل را در فایلی ذخیره نکند.

پس از دانلود فایل با curl، آرشیو tarball را با دستور زیر استخراج کنید:

tar xvf v3.6.2.tar.gz

این دستور چندین دایرکتوری و فایل جدید را روی سرور شما ایجاد می‌کند. سپس وارد دایرکتوری والد جدید pgLoader شوید:

cd pgloader-3.6.2/

سپس از ابزار make برای کامپایل باینری pgloader استفاده کنید:

make pgloader

ممکن است این فرآیند چند دقیقه طول بکشد تا باینری pgloader ساخته شود.

پس از اتمام، فایل باینری را به دایرکتوری /usr/local/bin منتقل کنید؛ جایی که اوبونتو به دنبال فایل‌های اجرایی می‌گردد:

sudo mv ./build/bin/pgloader /usr/local/bin/

برای آزمایش نصب صحیح pgLoader، نسخه آن را بررسی کنید:

pgloader --version

خروجی نمونه:

pgloader version "3.6.2"
compiled with SBCL 1.4.5.debian

اکنون pgLoader نصب شده است، اما پیش از شروع مهاجرت، باید برخی تغییرات پیکربندی در هر دو نمونه PostgreSQL و MySQL اعمال کنید. ابتدا بر روی سرور PostgreSQL تمرکز خواهیم کرد.


مرحله 3-ایجاد یک نقش (Role) و پایگاه داده در PostgreSQL

دستور pgloader با کپی کردن داده‌های منبع، چه از یک فایل و چه به‌صورت مستقیم از یک پایگاه داده، و درج آن‌ها در یک پایگاه داده PostgreSQL کار می‌کند. به همین دلیل، یا باید pgLoader را به عنوان یک کاربر لینوکس اجرا کنید که دسترسی به پایگاه داده Postgres دارد یا باید یک نقش PostgreSQL با مجوزهای مناسب در دستور بارگذاری (load command) مشخص کنید.

PostgreSQL دسترسی به پایگاه داده را از طریق استفاده از نقش‌ها مدیریت می‌کند. بسته به پیکربندی نقش، می‌توان آن را به عنوان یک کاربر پایگاه داده یا گروهی از کاربران در نظر گرفت. در اکثر سیستم‌های مدیریت پایگاه داده، شما یک کاربر را با دستور SQL CREATE USER ایجاد می‌کنید. اما در Postgres، اسکریپتی به نام createuser به صورت پیش‌فرض نصب شده است که همانند یک wrapper برای دستور SQL CREATE USER عمل می‌کند و به شما امکان اجرای آن را مستقیماً از خط فرمان می‌دهد.

نکته: در PostgreSQL به‌طور پیش‌فرض برای احراز هویت به عنوان یک کاربر پایگاه داده از روش احراز هویت ident (پروتکل شناسایی) استفاده می‌شود، به جای استفاده از رمز عبور. در این روش، PostgreSQL نام کاربری اوبونتو مشتری را به عنوان نام کاربری مجاز پایگاه داده در نظر می‌گیرد. این امر در بسیاری از موارد امنیت بیشتری فراهم می‌کند، اما ممکن است در مواقعی که می‌خواهید یک برنامه خارجی به یکی از پایگاه‌های داده شما متصل شود، مشکل ایجاد کند.

pgLoader می‌تواند داده‌ها را به یک پایگاه داده Postgres از طریق نقشی که از روش ident برای احراز هویت استفاده می‌کند بارگذاری کند، به شرطی که نام آن نقش با نام کاربر لینوکسی که دستور pgloader را صادر می‌کند یکسان باشد. اما برای وضوح بیشتر این فرآیند، این آموزش نحوه ایجاد یک نقش PostgreSQL متفاوت را توضیح می‌دهد که به جای روش ident از رمز عبور برای احراز هویت استفاده می‌کند.

برای ایجاد نقش جدید، دستور زیر را روی سرور Postgres اجرا کنید. به گزینه -P توجه کنید که به createuser می‌گوید از شما برای نقش جدید رمز عبور بگیرد:

sudo -u postgres createuser --interactive -P

ممکن است ابتدا از شما رمز sudo خواسته شود. سپس اسکریپت از شما نام نقش جدید را می‌پرسد. در این راهنما، نام این نقش را pgloader_pg در نظر می‌گیریم.

خروجی نمونه:

Enter name of role to add: pgloader_pg

پس از آن، createuser از شما درخواست ورود و تأیید رمز عبور برای این نقش را می‌کند. حتماً این رمز عبور را یادداشت کنید زیرا در مرحله 5 برای انجام مهاجرت به آن نیاز خواهید داشت.

خروجی نمونه:

Enter password for new role: 
Enter it again: 

در نهایت، اسکریپت از شما می‌پرسد که آیا نقش جدید باید به عنوان superuser طبقه‌بندی شود یا خیر. در PostgreSQL، اتصال به پایگاه داده با نقش superuser به شما اجازه می‌دهد تا از تمامی چک‌های مجوز (permissions) پایگاه داده عبور کنید (به جز حق ورود). به همین دلیل، استفاده از دسترسی superuser نباید به سادگی انجام شود و مستندات PostgreSQL توصیه می‌کنند بیشتر کارهای پایگاه داده را با نقشی غیر از superuser انجام دهید. اما چون pgLoader برای دسترسی و بارگذاری داده‌ها به جداول به مجوزهای گسترده نیاز دارد، می‌توانید به این نقش جدید دسترسی superuser بدهید. به این منظور با تایپ y و سپس فشردن ENTER این گزینه را انتخاب کنید.

خروجی نمونه:

...
Shall the new role be a superuser? (y/n) y

PostgreSQL همچنین اسکریپت مفیدی به نام createdb دارد که به شما امکان ایجاد پایگاه داده از خط فرمان را می‌دهد. از آنجا که pgLoader نیز به یک پایگاه داده مقصد برای بارگذاری داده‌ها نیاز دارد، دستور زیر را برای ایجاد یک پایگاه داده اجرا کنید. در اینجا نام پایگاه داده را new_db در نظر می‌گیریم، اما می‌توانید نام دلخواه خود را انتخاب کنید:

sudo -u postgres createdb new_db

اگر خطایی رخ ندهد، این دستور بدون خروجی به پایان می‌رسد.

اکنون که یک کاربر PostgreSQL اختصاصی و یک پایگاه داده خالی برای بارگذاری داده‌های MySQL ایجاد کرده‌اید، چند تغییر دیگر لازم است قبل از انجام مهاجرت. شما باید یک کاربر اختصاصی MySQL با دسترسی به پایگاه داده منبع ایجاد کنید و گواهینامه‌های (certificates) سمت مشتری خود را به فروشگاه گواهی‌های مورد اعتماد اوبونتو اضافه کنید.


مرحله 4-ایجاد کاربر اختصاصی در MySQL و مدیریت گواهینامه‌ها

حفاظت از داده‌ها در برابر ناظرین (snoopers) یکی از مهم‌ترین وظایف هر مدیر پایگاه داده است. مهاجرت داده از یک ماشین به ماشین دیگر فرصتی برای افراد بدخواه فراهم می‌آورد تا بسته‌های ارسالی در اتصال شبکه را در صورت عدم رمزگذاری (encrypted) شنود کنند. در این مرحله، یک کاربر اختصاصی MySQL ایجاد خواهید کرد که pgLoader از آن برای انجام مهاجرت از طریق اتصال SSL استفاده خواهد کرد.

ابتدا، ترمینال MySQL را باز کنید:

mysql -u root -p

در پرامپت MySQL، با استفاده از دستور CREATE USER یک کاربر جدید MySQL ایجاد کنید. در اینجا نام این کاربر را pgloader_my قرار می‌دهیم. از آنجا که این کاربر فقط از سرور PostgreSQL شما به MySQL دسترسی خواهد داشت، حتماً به جای your_postgres_server_ip، آدرس IP عمومی سرور PostgreSQL خود را وارد کنید. همچنین، به جای password، یک رمز عبور یا عبارت عبور امن انتخاب کنید:

CREATE USER 'pgloader_my'@'your_postgres_server_ip' IDENTIFIED BY 'password' REQUIRE SSL;

توجه داشته باشید که بخش REQUIRE SSL در انتهای این دستور، دسترسی کاربر pgloader_my را محدود به اتصالات امن (SSL) می‌کند.

سپس، دسترسی این کاربر به پایگاه داده منبع و تمامی جداول آن را اعطا کنید. در اینجا، پایگاه داده‌ای که در مرحله اختیاری 1 ایجاد کردیم (source_db) مشخص شده است؛ اگر پایگاه داده دیگری برای مهاجرت دارید، نام آن را به جای source_db قرار دهید:

GRANT ALL ON source_db.* TO 'pgloader_my'@'your_postgresql_server_ip';

سپس دستور FLUSH PRIVILEGES را اجرا کنید تا جداول اعطای مجوز (grant tables) دوباره بارگذاری شوند و تغییرات اعمال شوند:

FLUSH PRIVILEGES;

پس از این کار، از پرامپت MySQL خارج شوید:

exit

سپس به سرور Postgres خود بازگردید و سعی کنید به سرور MySQL به عنوان کاربر جدید pgloader_my متصل شوید. اگر آموزش پیکربندی SSL/TLS برای MySQL را دنبال کرده باشید، ابزار mysql-client روی سرور PostgreSQL نصب شده و باید بتوانید با دستور زیر متصل شوید:

mysql -u pgloader_my -p -h your_mysql_server_ip

اگر دستور موفق باشد، پرامپت MySQL نمایش داده می‌شود.

پس از تأیید اینکه کاربر pgloader_my با موفقیت می‌تواند متصل شود، ترمینال MySQL را ببندید:

exit

در این نقطه، شما یک کاربر اختصاصی MySQL دارید که از ماشین Postgres به پایگاه داده منبع دسترسی دارد. اما اگر سعی کنید پایگاه داده MySQL خود را با استفاده از SSL مهاجرت دهید، این تلاش با خطا مواجه خواهد شد.

دلیل این موضوع آن است که pgLoader قادر به خواندن فایل‌های پیکربندی MySQL نیست و بنابراین نمی‌داند که باید گواهی CA یا گواهی مشتری (client certificate) را که در راهنمای پیکربندی SSL/TLS کپی کرده‌اید، از کجا بگیرد. به جای نادیده گرفتن نیازهای SSL، pgLoader استفاده از گواهینامه‌های مورد اعتماد (trusted certificates) را در مواردی که SSL برای اتصال به MySQL لازم است، الزامی می‌کند. از این رو، می‌توانید این مشکل را با اضافه کردن فایل‌های ca.pem و client-cert.pem به فروشگاه گواهی‌های مورد اعتماد اوبونتو حل کنید.

برای این کار، فایل‌های ca.pem و client-cert.pem را به دایرکتوری /usr/local/share/ca-certificates/ کپی کنید. توجه داشته باشید که باید نام این فایل‌ها را تغییر دهید تا پسوند .crt داشته باشند. در غیر این صورت، سیستم شما قادر نخواهد بود تشخیص دهد که گواهینامه‌های جدید اضافه شده‌اند:

sudo cp ~/client-ssl/ca.pem /usr/local/share/ca-certificates/ca.pem.crt
sudo cp ~/client-ssl/client-cert.pem /usr/local/share/ca-certificates/client-cert.pem.crt

سپس دستور update-ca-certificates را اجرا کنید. این برنامه به دنبال گواهینامه‌ها در /usr/local/share/ca-certificates می‌گردد، گواهینامه‌های جدید را به دایرکتوری /etc/ssl/certs/ اضافه می‌کند و فهرستی از گواهینامه‌های SSL مورد اعتماد (ca-certificates.crt) را بر اساس محتوای /etc/ssl/certs/ ایجاد می‌کند:

sudo update-ca-certificates

خروجی نمونه:

Updating certificates in /etc/ssl/certs...
2 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

با انجام این مراحل، آماده‌اید تا پایگاه داده MySQL خود را به PostgreSQL مهاجرت دهید.


مرحله 5-مهاجرت داده‌ها

اکنون که دسترسی از راه دور از سرور PostgreSQL به سرور MySQL پیکربندی شده است، آماده شروع مهاجرت داده‌ها هستید.

توجه: قبل از انجام هرگونه عملی که ممکن است بر یکپارچگی داده‌ها تأثیر بگذارد، بسیار مهم است که از پایگاه داده خود پشتیبان (backup) تهیه کنید. اما در مهاجرت با استفاده از pgLoader نیازی به تهیه پشتیبان نیست زیرا این ابزار داده‌ها را حذف یا تغییر نمی‌دهد؛ تنها آن‌ها را کپی می‌کند.

با این حال، اگر احساس احتیاط می‌کنید و مایلید قبل از مهاجرت از داده‌ها نسخه پشتیبان تهیه کنید، می‌توانید از ابزار mysqldump استفاده کنید. برای جزئیات به مستندات رسمی MySQL مراجعه کنید.

pgLoader به کاربران اجازه می‌دهد تا با یک دستور، کل پایگاه داده را مهاجرت دهند. برای مهاجرت از یک پایگاه داده MySQL به یک پایگاه داده PostgreSQL روی سرور جداگانه، سینتکس دستور به صورت زیر خواهد بود:

pgloader mysql://mysql_username:password@mysql_server_ip/source_database_name?option_1=value&option_n=value \
         postgresql://postgresql_role_name:password@postgresql_server_ip/target_database_name?option_1=value&option_n=value

این دستور شامل فرمان pgloader و دو رشته اتصال (connection strings) است؛ اولین رشته برای پایگاه داده منبع و دومین رشته برای پایگاه داده مقصد. هر دو رشته اتصال با اعلام نوع سیستم مدیریت پایگاه داده (DBMS) آغاز می‌شوند، سپس نام کاربری و رمز عبور که دسترسی به پایگاه داده دارند (با علامت دو نقطه از هم جدا شده‌اند)، آدرس میزبان سروری که پایگاه داده روی آن نصب شده، نام پایگاه داده‌ای که pgLoader باید به آن متصل شود و گزینه‌های مختلفی که بر رفتار pgLoader تأثیر می‌گذارند را شامل می‌شوند.

با استفاده از پارامترهای تعریف‌شده در بخش‌های قبل این آموزش، می‌توانید پایگاه داده MySQL خود را با ساختار زیر مهاجرت دهید. حتماً مقادیر برجسته‌شده را مطابق با تنظیمات خود تغییر دهید:

pgloader mysql://pgloader_my:mysql_password@mysql_server_ip/source_db?useSSL=true \
         postgresql://pgloader_pg:postgresql_password@localhost/new_db

توجه داشته باشید که این دستور شامل گزینه useSSL در رشته اتصال MySQL است. با تنظیم این گزینه بر روی true، pgLoader از طریق SSL به MySQL متصل می‌شود. این امر ضروری است زیرا سرور MySQL خود را طوری پیکربندی کرده‌اید که تنها اتصالات امن (SSL) را بپذیرد.

اگر این دستور با موفقیت اجرا شود، خروجی‌ای مشابه جدول زیر نمایش داده می‌شود که نحوه مهاجرت داده‌ها را توصیف می‌کند:

Output
. . .
             table name     errors       rows      bytes      total time
-----------------------  ---------  ---------  ---------  --------------
        fetch meta data          0          2                     0.111s
         Create Schemas          0          0                     0.001s
       Create SQL Types          0          0                     0.005s
          Create tables          0          2                     0.017s
         Set Table OIDs          0          1                     0.010s
-----------------------  ---------  ---------  ---------  --------------
 source_db.sample_table          0          5     0.2 kB          0.048s
-----------------------  ---------  ---------  ---------  --------------
COPY Threads Completion          0          4                     0.052s
 Index Build Completion          0          1                     0.011s
         Create Indexes          0          1                     0.006s
        Reset Sequences          0          0                     0.014s
           Primary Keys          0          1                     0.001s
    Create Foreign Keys          0          0                     0.000s
        Create Triggers          0          0                     0.000s
       Install Comments          0          0                     0.000s
-----------------------  ---------  ---------  ---------  --------------
      Total import time          ✓          5     0.2 kB          0.084s

برای بررسی اینکه آیا داده‌ها به‌درستی مهاجرت یافته‌اند، پرامپت PostgreSQL را باز کنید:

sudo -i -u postgres psql

سپس به پایگاه داده‌ای که داده‌ها در آن بارگذاری شده‌اند متصل شوید:

\c new_db

سپس کوئری زیر را اجرا کنید تا بررسی شود داده‌های مهاجرت‌شده در پایگاه داده PostgreSQL ذخیره شده‌اند یا خیر:

SELECT * FROM source_db.sample_table;

توجه: به عبارت FROM در این کوئری دقت کنید که جدول sample_table را که در اسکیمای source_db قرار دارد مشخص می‌کند:

... FROM source_db.sample_table;

این نام‌گذاری به صورت واجد شرایط (qualified name) نامیده می‌شود. شما حتی می‌توانید به صورت کامل و واجد شرایط نام را مشخص کنید به‌طوری که نام پایگاه داده به همراه نام اسکیمای مربوطه و جدول را درج کنید:

... FROM new_db.source_db.sample_table;

هنگامی که در یک پایگاه داده PostgreSQL کوئری اجرا می‌کنید، اگر جدول در اسکیمای پیش‌فرض public قرار داشته باشد نیازی به این دقت ندارید. دلیلی که در اینجا باید این کار را انجام دهید این است که هنگامی که pgLoader داده‌ها را به PostgreSQL بارگذاری می‌کند، یک اسکیمای جدید با نام پایگاه داده اصلی — در اینجا source_db — ایجاد کرده و هدف قرار می‌دهد. این رفتار پیش‌فرض pgLoader برای مهاجرت از MySQL به PostgreSQL است. با این حال، شما می‌توانید با استفاده از یک فایل بارگذاری (load file) به pgLoader دستور دهید تا پس از بارگذاری داده‌ها، اسکیمای جدول را به public تغییر دهد. برای مثال، به مرحله بعد مراجعه کنید.

اگر داده‌ها به درستی بارگذاری شده باشند، خروجی کوئری مشابه جدول زیر خواهد بود:

 employee_id | first_name |  last_name  | start_date |   salary   
-------------+------------+-------------+------------+------------
           1 | Elizabeth  | Cotten      | 2007-11-11 | $105433.18
           2 | Yanka      | Dyagileva   | 2017-10-30 | $107540.67
           3 | Lee        | Dorsey      | 2013-06-04 | $118024.04
           4 | Kasey      | Chambers    | 2010-08-18 | $116456.98
           5 | Bram       | Tchaikovsky | 2018-09-16 | $61989.50
(5 rows)

برای بستن پرامپت PostgreSQL، دستور زیر را اجرا کنید:

\q

حالا که نحوه مهاجرت یک پایگاه داده MySQL از طریق شبکه و بارگذاری آن در یک پایگاه داده PostgreSQL را مرور کردیم، به چند سناریوی دیگر مهاجرت که در آن‌ها pgLoader می‌تواند مفید باشد می‌پردازیم.


مرحله 6-بررسی گزینه‌های دیگر مهاجرت

pgLoader ابزاری بسیار منعطف است که در موقعیت‌های متنوعی می‌تواند مفید واقع شود. در این بخش، نگاهی سریع به چند روش دیگر برای استفاده از pgLoader جهت مهاجرت یک پایگاه داده MySQL به PostgreSQL خواهیم داشت.

مهاجرت با استفاده از فایل بارگذاری (Load File) pgLoader

در زمینه pgLoader، یک فایل بارگذاری (load file) یا فایل فرمان، فایلی است که به pgLoader می‌گوید چگونه باید یک مهاجرت را انجام دهد. این فایل می‌تواند شامل دستورات و گزینه‌هایی باشد که بر رفتار pgLoader تأثیر می‌گذارند، به شما کنترل دقیق‌تری روی نحوه بارگذاری داده‌ها در PostgreSQL می‌دهند و امکان انجام مهاجرت‌های پیچیده را فراهم می‌کنند.

مستندات pgLoader دستورالعمل‌های جامعی درباره استفاده و گسترش این فایل‌ها جهت پشتیبانی از انواع مهاجرت‌ها ارائه می‌دهد، بنابراین در اینجا یک مثال نسبتاً ابتدایی را بررسی می‌کنیم. همان مهاجرتی که در مرحله 5 انجام دادیم را تکرار می‌کنیم، اما همچنین یک دستور ALTER SCHEMA را اضافه می‌کنیم تا اسکیمای پایگاه داده new_db از source_db به public تغییر کند.

برای شروع، یک فایل بارگذاری جدید روی سرور PostgreSQL با ویرایشگر متنی دلخواه خود ایجاد کنید:

nano pgload_test.load

سپس محتویات زیر را اضافه کنید (مقادیر برجسته را مطابق با پیکربندی خود به‌روزرسانی کنید):

pgload_test.load
LOAD DATABASE
     FROM      mysql://pgloader_my:mysql_password@mysql_server_ip/source_db?useSSL=true
     INTO      pgsql://pgloader_pg:postgresql_password@localhost/new_db

 WITH include drop, create tables

ALTER SCHEMA 'source_db' RENAME TO 'public'
;

توضیح هر یک از این بخش‌ها:

  • LOAD DATABASE:
    این خط به pgLoader دستور می‌دهد تا داده‌ها را از یک پایگاه داده مجزا بارگذاری کند، نه از یک فایل یا آرشیو داده.
  • FROM:
    این بخش پایگاه داده منبع را مشخص می‌کند. در اینجا به رشته اتصال (connection string) مربوط به پایگاه داده MySQL که در مرحله 1 ایجاد کردیم اشاره می‌شود.
  • INTO:
    به همین ترتیب، این خط پایگاه داده PostgreSQL مقصد را مشخص می‌کند که pgLoader باید داده‌ها را در آن بارگذاری کند.
  • WITH:
    این بخش به شما امکان می‌دهد رفتارهای مشخصی برای pgLoader تعریف کنید. لیست کامل گزینه‌های WITH که با مهاجرت‌های MySQL سازگار هستند در اینجا موجود است. در این مثال تنها دو گزینه استفاده شده‌اند:
    • include drop:
      زمانی که این گزینه استفاده شود، pgLoader هر جدولی را در پایگاه داده PostgreSQL مقصد که در پایگاه داده منبع MySQL نیز وجود داشته باشد، حذف می‌کند. اگر از این گزینه هنگام مهاجرت به یک پایگاه داده PostgreSQL موجود استفاده کنید، باید از کل پایگاه داده پشتیبان تهیه کنید تا از از دست رفتن داده‌ها جلوگیری شود.
    • create tables:
      این گزینه به pgLoader می‌گوید تا جداول جدیدی را در پایگاه داده PostgreSQL مقصد بر اساس متادیتای موجود در پایگاه داده MySQL ایجاد کند. اگر گزینه معکوس، یعنی عدم ایجاد جداول، استفاده شود، جداول مقصد باید پیش از مهاجرت در پایگاه داده PostgreSQL وجود داشته باشند.
  • ALTER SCHEMA:
    پس از بخش WITH، می‌توانید دستورات SQL خاصی مانند این را اضافه کنید تا به pgLoader دستور دهید اقدامات اضافی را انجام دهد. در اینجا به pgLoader دستور داده‌ایم تا پس از ایجاد اسکیمای جدید، آن را از source_db به public تغییر دهد. توجه داشته باشید که می‌توانید چنین دستورات را در داخل بخش‌های دیگر — مانند BEFORE LOAD DO — نیز تودرتو قرار دهید تا pgLoader آن‌ها را در نقاط مشخصی از فرآیند مهاجرت اجرا کند.

این یک مثال نمایشی از آنچه می‌توانید در یک فایل بارگذاری برای تغییر رفتار pgLoader وارد کنید، است. فهرست کامل بندهایی که می‌توانید به یک فایل بارگذاری اضافه کنید و عملکرد آن‌ها در مستندات رسمی pgLoader موجود است.

پس از افزودن محتویات، فایل بارگذاری را ذخیره و ببندید. برای استفاده از آن، نام فایل را به عنوان آرگومان به دستور pgloader اضافه کنید:

pgloader pgload_test.load

برای آزمایش موفقیت‌آمیز بودن مهاجرت، پرامپت PostgreSQL را باز کنید:

sudo -u postgres psql

سپس به پایگاه داده متصل شوید:

\c new_db

و کوئری زیر را اجرا کنید:

SELECT * FROM sample_table;

خروجی باید مشابه جدول زیر باشد:

 employee_id | first_name |  last_name  | start_date |   salary   
-------------+------------+-------------+------------+------------
           1 | Elizabeth  | Cotten      | 2007-11-11 | $105433.18
           2 | Yanka      | Dyagileva   | 2017-10-30 | $107540.67
           3 | Lee        | Dorsey      | 2013-06-04 | $118024.04
           4 | Kasey      | Chambers    | 2010-08-18 | $116456.98
           5 | Bram       | Tchaikovsky | 2018-09-16 | $61989.50
(5 rows)

این خروجی تأیید می‌کند که pgLoader داده‌ها را به‌درستی مهاجرت داده است و همچنین دستور ALTER SCHEMA واردشده در فایل بارگذاری طبق انتظار عمل کرده است، زیرا دیگر نیازی به مشخص کردن اسکیمای source_db در کوئری برای مشاهده داده‌ها ندارید.

توجه داشته باشید که اگر قصد دارید از یک فایل بارگذاری برای مهاجرت داده‌های موجود در یک پایگاه داده به پایگاه داده‌ای در دستگاهی جداگانه استفاده کنید، همچنان باید تنظیمات مربوط به شبکه و قوانین فایروال را تغییر دهید تا مهاجرت با موفقیت انجام شود.


مهاجرت یک پایگاه داده MySQL به PostgreSQL به‌صورت محلی

شما می‌توانید از pgLoader برای مهاجرت یک پایگاه داده MySQL به یک پایگاه داده PostgreSQL که بر روی همان دستگاه قرار دارد استفاده کنید. تنها کاری که باید انجام دهید این است که دستور مهاجرت را از یک پروفایل کاربری لینوکس با دسترسی به کاربر root MySQL اجرا کنید:

pgloader mysql://root@localhost/source_db pgsql://sammy:postgresql_password@localhost/target_db

انجام یک مهاجرت محلی به این معناست که نیازی به تغییر پیکربندی پیش‌فرض شبکه MySQL یا قوانین فایروال سیستم ندارید.


مهاجرت از یک فایل CSV

همچنین می‌توانید یک پایگاه داده PostgreSQL را با داده‌های موجود در یک فایل CSV بارگذاری کنید.

فرض کنید فایل CSV به نام load.csv دارید، دستور بارگذاری آن به یک پایگاه داده PostgreSQL ممکن است به صورت زیر باشد:

pgloader load.csv pgsql://sammy:password@localhost/target_db

از آنجا که فرمت CSV کاملاً استاندارد نیست، احتمال دارد در هنگام بارگذاری مستقیم داده از یک فایل CSV با مشکلاتی مواجه شوید. خوشبختانه، می‌توانید با استفاده از گزینه‌های مختلف در خط فرمان pgLoader یا با مشخص کردن آن‌ها در یک فایل بارگذاری، ناهنجاری‌ها را اصلاح کنید. برای جزئیات بیشتر، به مستندات pgLoader در این خصوص مراجعه کنید.


مهاجرت به یک پایگاه داده PostgreSQL مدیریت‌شده

همچنین امکان انجام مهاجرت از یک پایگاه داده خودمدیریت به یک پایگاه داده PostgreSQL مدیریت‌شده وجود دارد. برای نشان دادن اینکه چنین مهاجرتی چگونه می‌تواند باشد، از سرور MySQL و یک پایگاه داده PostgreSQL مدیریت‌شده توسط DigitalOcean استفاده خواهیم کرد. همچنین از پایگاه داده نمونه‌ای که در مرحله 1 ایجاد کردیم استفاده می‌کنیم؛ اما اگر آن مرحله را رد کرده‌اید و پایگاه داده دیگری برای مهاجرت دارید، می‌توانید به همان پایگاه داده اشاره کنید.

توجه: برای دستورالعمل‌های مربوط به راه‌اندازی یک پایگاه داده مدیریت‌شده DigitalOcean، به راهنمای شروع سریع پایگاه داده مدیریت‌شده ما مراجعه کنید.

در این مهاجرت، نیازی به استفاده از گزینه useSSL در pgLoader نخواهیم داشت زیرا این گزینه تنها با پایگاه‌های داده MySQL راه دور کار می‌کند و ما این مهاجرت را از یک پایگاه داده MySQL محلی اجرا خواهیم کرد. با این حال، از گزینه sslmode=require هنگام بارگذاری و اتصال به پایگاه داده PostgreSQL مدیریت‌شده DigitalOcean استفاده خواهیم کرد تا از ایمن ماندن داده‌های شما اطمینان حاصل شود.

از آنجا که این بار از گزینه useSSL استفاده نمی‌کنیم، می‌توانید از apt برای نصب pgLoader به همراه بسته postgresql-client استفاده کنید، که به شما اجازه می‌دهد از سرور MySQL خود به پایگاه داده PostgreSQL مدیریت‌شده دسترسی پیدا کنید:

sudo apt install pgloader postgresql-client

پس از آن، می‌توانید دستور pgloader را برای مهاجرت پایگاه داده اجرا کنید. برای این کار، به رشته اتصال (connection string) پایگاه داده مدیریت‌شده نیاز دارید.

برای پایگاه‌های داده مدیریت‌شده DigitalOcean، می‌توانید رشته اتصال را از Cloud Control Panel کپی کنید. ابتدا در منوی کناری سمت چپ بر روی Databases کلیک کنید و پایگاه داده‌ای که می‌خواهید داده‌ها به آن مهاجرت یابند را انتخاب کنید. سپس به بخش Connection Details پایین صفحه بروید. از منوی کشویی، گزینه Connection string را انتخاب کنید. سپس روی دکمه Copy کلیک کنید تا رشته اتصال در کلیپ‌بورد شما کپی شود و آن را در دستور مهاجرت زیر جایگزین کنید (رشته اتصال PostgreSQL نمونه‌ای که در اینجا نمایش داده شده را با رشته اتصال واقعی خود جایگزین کنید). این عمل پایگاه داده MySQL شما را به پایگاه داده defaultdb در PostgreSQL به عنوان نقش PostgreSQL به نام doadmin مهاجرت می‌دهد:

pgloader mysql://root:password@localhost/source_db postgres://doadmin:password@db_host/defaultdb?sslmode=require

پس از این، می‌توانید همان رشته اتصال را به عنوان آرگومان به دستور psql بدهید تا به پایگاه داده PostgreSQL مدیریت‌شده متصل شوید و تأیید کنید که مهاجرت موفقیت‌آمیز بوده است:

psql postgres://doadmin:password@db_host/defaultdb?sslmode=require

سپس کوئری زیر را اجرا کنید تا بررسی کنید pgLoader داده‌ها را به‌درستی مهاجرت داده است:

SELECT * FROM source_db.sample_table;

خروجی باید به شکل زیر باشد:

 employee_id | first_name |  last_name  | start_date |   salary   
-------------+------------+-------------+------------+------------
           1 | Elizabeth  | Cotten      | 2007-11-11 | $105433.18
           2 | Yanka      | Dyagileva   | 2017-10-30 | $107540.67
           3 | Lee        | Dorsey      | 2013-06-04 | $118024.04
           4 | Kasey      | Chambers    | 2010-08-18 | $116456.98
           5 | Bram       | Tchaikovsky | 2018-09-16 | $61989.50
(5 rows)

این خروجی تأیید می‌کند که pgLoader پایگاه داده MySQL شما را به‌درستی به نمونه PostgreSQL مدیریت‌شده مهاجرت داده است.

 

نتیجه‌گیری

pgLoader ابزاری منعطف است که می‌تواند یک مهاجرت پایگاه داده را تنها با یک دستور انجام دهد. با انجام چند تغییر پیکربندی، می‌تواند یک پایگاه داده کامل را از یک ماشین فیزیکی به ماشین دیگر با استفاده از یک اتصال امن SSL/TLS مهاجرت دهد. امیدواریم با دنبال کردن این آموزش، درک واضح‌تری از قابلیت‌ها و کاربردهای احتمالی pgLoader کسب کرده باشید.

 

 

۶۵
۱۴۰۳/۱۲/۱۶