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

 

در نگاه اول، انتقال یک پایگاه داده می‌تواند ترسناک به نظر برسد؛ به‌خصوص هنگام انتقال از یک سیستم مدیریت پایگاه داده به سیستم دیگر. pgLoader، یک ابزار انتقال پایگاه داده منبع باز است که هدف آن ساده سازی روند انتقال به PostgreSQL است. این ابزار، از انتقال چندین نوع فایل و RBDMS؛ از جمله MySQL و SQLite به PostgreSQL پشتیبانی می‌کند.

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

 

این مطلب نیز ممکن است برای شما مفید باشد: پایگاه داده چیست؟ SQL چیست؟

 

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

  • دسترسی به دو سرور که هر کدام از آن‌ها، اوبونتو 18.04 را اجرا می‌کنند. هر دو سرور باید دارای یک فایروال و یک کاربر غیر root باشند که دارای امتیازات sudo است.
  • MySQL باید روی یکی از سرورها نصب شده باشد.
  • PostgreSQL باید روی سرور دیگر نصب شده باشد.
  • سرور MySQL شما باید به گونه‌ای تنظیم شده باشد که اتصالات رمزگذاری شده را بپذیرد. قبل از دنبال کردن این راهنما، مطمئن شوید که از سرور PostgreSQL خود به عنوان ماشین کلاینت MySQL استفاده می‌کنید. همچنین، برای انتقال داده‌ها با pgLoader باید بتوانید، از طریق دستگاه Postgres به سرور MySQL خود متصل شوید.

لطفاً توجه داشته باشید که در سرتاسر این راهنما، از سروری که MySQL را روی آن نصب کرده‌اید، به عنوان سرور MySQL یاد می‌شود و هر دستوری که باید در این دستگاه اجرا شود، مانند زیر، با نام کاربر mysql-server یا mysql همراه خواهد بود:

mysql-server$

به همین ترتیب، از سروری که PostgreSQL را روی آن نصب کرده‌اید، به عنوان سرور PostgreSQL یا Postgres یاد می‌شود و هر دستوری که باید در این دستگاه اجرا شود، مانند زیر، با نام کاربر postgres-server همراه خواهد بود:

postgres-server$

لطفاً هنگام پیگیری این آموزش، این موارد را به خاطر بسپارید تا از هرگونه سردرگمی جلوگیری شود.

 

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

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

این مرحله را با باز کردن ترمینال MySQL در سرور MySQL خود شروع کنید:

mysql-server$ mysql -u root -p

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

با اجرای دستور زیر، یک پایگاه داده جدید ایجاد نمایید. در اینجا نام پایگاه داده Source_db است. شما می‌توانید پایگاه داده خود را هرچه دوست دارید، نام‌گذاری کنید.

mysql> CREATE DATABASE source_db;

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

mysql> USE source_db;
output:
Database changed

 

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

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

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

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

به دنبال این، می‌توانید ترمینال MySQL را ببندید:

mysql> exit

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

 

مرحله 2 – نصب pgLoader

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

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

قبل از نصب pgLoader باید وابستگی‌های آن را نصب نمایید. اگر اخیراً چنین کاری نکرده‌اید، ابتدا بسته‌های سرور Postgres خود را به روز کنید:

postgres-server$ sudo apt update

 

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

sbcl: یک کامپایلر مشترک Lisp است.

Unzip: یک استخراج کننده برای فایل‌های zip است.

libsqlite3-dev: مجموعه‌ای از فایل‌های توسعه برای SQLite 3 است.

gawk: مخفف "GNU awk" است که یک زبان اسکن و پردازش الگو به حساب می‌آید.

curl: یک ابزار خط فرمان برای کنترل داده‌ها از یک URL است.

make: ابزاری برای مدیریت کامپایل بسته است.

freetds-dev: یک کتابخانه کلاینت برای پایگاه داده‌های MS SQL و Sybase است.

libzip-dev: کتابخانه‌ای برای خواندن، ایجاد و تغییر بایگانی‌های zip است.

 

این مطلب نیز ممکن است برای شما مفید باشد: حذف پایگاه داده در MySQL از طریق خط فرمان

 

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

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

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

در مرحله بعد، به صفحه منتشر شده پروژه pgLoader GitHub بروید و آخرین نسخه را پیدا کنید. برای این راهنما، ما از نسخه 3.6.2 استفاده کرده‌ایم. به منوی Assets بروید و لینک فایل tar.gz را با عنوان Source code کپی نمایید. سپس لینک را در دستور curl زیر جایگزین کنید و URL زیر را جایگزین نمایید:

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

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

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

پس از بارگیری، آن را با دستور زیر استخراج نمایید:

postgres-server$ tar xvf v3.6.2.tar.gz

 

با این کار، تعدادی دایرکتوری و فایل جدید در سرور شما ایجاد می‌شود. به دایرکتوری والد جدید pgLoader بروید:

postgres-server$ cd pgloader-3.6.2/

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

postgres-server$ make pgloader

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

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

postgres-server$ sudo mv ./build/bin/pgloader /usr/local/bin/

با بررسی نسخه آن می‌توانید، بررسی کنید که pgLoader به درستی نصب شده است، این کار را می‌توانید به صورت زیر انجام دهید:

postgres-server$ pgloader --version
output:
pgloader version "3.6.2"
compiled with SBCL 1.4.5.debian

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

 

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

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

PostgreSQL، دسترسی پایگاه داده را از طریق استفاده از نقش‌ها مدیریت می‌کند. بسته به نحوه پیکربندی نقش می‌توان آن را به عنوان یک کاربر پایگاه داده یا گروهی از کاربران پایگاه داده در نظر گرفت. در بیشتر RDBMS‌ها، شما با دستور CREATE USER مربوط به SQL یک کاربر ایجاد می‌نمایید.

Postgres همراه با یک اسکریپت مفید به نام createuser نصب می‌شود. این اسکریپت، به عنوان یک بسته برای دستور CREATE USER عمل می‌کند که می‌توانید مستقیماً از خط فرمان اجرا کنید.

توجه: در PostgreSQL، به جای استفاده از گذرواژه، به عنوان یک کاربر پایگاه داده با استفاده از پروتکل شناسایی، شناسه، یا دیگر روش‌ها احراز هویت می‌کنید. این، PostgreSQL را درگیر گرفتن نام کاربری اوبونتوی کلاینت و استفاده از آن به عنوان نام کاربری مجاز پایگاه داده Postgres می‌نماید. این امر در بسیاری از موارد، امنیت بیشتری را فراهم می‌کند؛ اما همچنین می‌تواند باعث بروز مشکلاتی در مواردی شود که می‌خواهید یک برنامه خارج از آن به یکی از پایگاه‌های داده شما متصل شود.

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

 

این مطلب نیز ممکن است برای شما مفید باشد: ایجاد کاربر، پایگاه داده و افزودن دسترسی در PostgreSQL

 

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

postgres-server$ sudo -u postgres createuser --interactive -P

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

output:
Enter name of role to add: pgloader_pg

به دنبال آن، createuser از شما می‌خواهد، رمز عبور این نقش را وارد کرده و آن را تأیید نمایید. دقت کنید که حتماً این گذرواژه را یادداشت کنید؛ زیرا برای انجام انتقال در مرحله 5 به آن نیاز خواهید داشت:

output:
Enter password for new role: 
Enter it again: 

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

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

 

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

در اینجا، نام این پایگاه داده را new_db قرار داده‌ایم؛ اما در صورت تمایل می‌توانید آن را تغییر دهید:

postgres-server$ sudo -u postgres createdb new_db

اگر خطایی وجود نداشته باشد، این دستور بدون هیچ خروجی بطور کامل اجرا می‌شود.

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

 

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

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

این کار را با باز کردن ترمینال MySQL خود شروع کنید:

mysql-server$ mysql -u root -p

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

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

به بند REQUIRE SSL در انتهای این دستور توجه داشته باشید. این کار باعث می‌شود، کاربر pgloader_my تنها از طریق اتصال امن SSL به پایگاه داده دسترسی پیدا کند.

 

در مرحله بعد، به کاربر pgloader_my اجازه دسترسی به پایگاه داده هدف و تمام جداول آن را بدهید. در اینجا، پایگاه داده ایجاد شده در مرحله 1 را تعیین خواهیم کرد، اما اگر پایگاه داده خود را دارید و می‌خواهید آن را منتقل نمایید، از نام آن به جای source_db استفاده کنید:

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

سپس دستور FLUSH PRIVILEGES را برای بارگیری مجدد جداول و فعالسازی تغییرات امتیازات اجرا نمایید:

mysql> FLUSH PRIVILEGES;

در انتها می‌توانید ترمینال MySQL را ببندید:

mysql> exit

 

اکنون، به سرور Postgres خود برگشته و سعی نمایید به عنوان کاربر جدید pgloader_my وارد سرور MySQL شوید. چنانچه  mysql-client روی سرور PostgreSQL نصب شده باشد، شما می‌توانید با دستور زیر با آن ارتباط برقرار کنید:

postgres-server$ mysql -u pgloader_my -p -h your_mysql_server_ip

در صورت موفقیت آمیز بودن دستور، ترمینال MySQL را مشاهده خواهید کرد:

mysql>

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

mysql> exit

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

دلیل این امر این است که pgLoader قادر به خواندن فایل‌های پیکربندی MySQL نیست؛ بنابراین نمی‌داند کجا گواهینامه CA یا گواهی کلاینت را که در سرور PostgreSQL خود کپی کرده‌اید، جستجو نماید. بر این اساس می‌توانید با افزودن فایل‌های ca.pem و client-cert.pem به مجموعه گواهی‌های معتبر اوبونتو، این مشکل را برطرف کنید.

 

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

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

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

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

اکنون، شما آماده هستید که پایگاه داده MySQL خود را به PostgreSQL منتقل کنید.

 

این مطلب نیز ممکن است برای شما مفید باشد: فعال سازی دسترسی از راه دور به سرور پایگاه داده MySQL

 

مرحله 5 - انتقال داده‌ها

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

توجه: اگرچه برای اطمینان از عدم تغییر یا حذف داده‌هایتان، حتماً قبل از هر اقدامی باید از پایگاه داده خود پشتیبان تهیه کنید، هنگام انجام انتقال با 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 string) است؛ اولی برای پایگاه داده منبع و دیگری برای پایگاه داده هدف. هر دو این رشته‌های اتصال، با تعیین اینکه رشته اتصال به کدام نوع DBMS اشاره می‌کند، شروع می‌شود و به دنبال آن، نام کاربری و رمزعبور دسترسی به پایگاه داده (توسط یک کاما جدا می‌شود)، آدرس میزبان سرور که پایگاه داده در آن نصب شده، نام پایگاه داده pgLoader که باید هدف قرار گیرد و گزینه‌های مختلفی که بر رفتار pgLoader تأثیر می‌گذارد.

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

postgres-server$ 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 خود را طوری تنظیم کرده‌اید که تنها اتصالات ایمن را بپذیرد.

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

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 را باز کنید:

postgres-server$ sudo -i -u postgres psql

و از آنجا، به پایگاه داده‌ای که داده‌ها را در آن بارگیری کرده‌اید، متصل شوید:

postgres=# \c new_db

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

new_db=# SELECT * FROM source_db.sample_table;

 

توجه: به بند FROM در این کوئری توجه نمایید که sample_table را در طرح Source_db مشخص می‌کند:

new_db=# . . . FROM source_db.sample_table;

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

new_db=# . . . FROM new_db.source_db.sample_table;

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

 

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

output:
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)

برای بستن ترمنیال Postgres، دستور زیر را اجرا نمایید:

new_db=# \q

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

 

این مطلب نیز ممکن است برای شما مفید باشد: درون و برون ریزی پایگاه داده و تنظیم مجدد رمز عبور در Mysql

 

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

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

 

انتقال با یک فایل بارگیری pgLoader

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

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

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

postgres-server$ 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: این بند، پایگاه داده منبع را مشخص می‌نماید. در این حالت، به رشته اتصال پایگاه داده MySQL که در مرحله 1 ایجاد کرده‌ایم، اشاره می‌کند.

INTO: این خط، پایگاه داده PostgreSQL را مشخص می‌نماید که pgLoader باید داده‌ها را در آن بارگیری کند.

WITH: این بند به شما امکان می‌دهد، رفتارهای خاصی را برای pgLoader تعریف نمایید. لیست کامل گزینه‌های WITH سازگار با انتقال MySQL را می‌توانید در اینجا پیدا کنید. در این مثال ما فقط دو گزینه داریم:

  • include drop: وقتی از این گزینه استفاده می‌شود، pgLoader تمام جداول پایگاه داده PostgreSQL هدف را که در پایگاه داده منبع MySQL نیز وجود دارد، حذف می‌کند. اگر هنگام انتقال داده‌ها به یک پایگاه داده PostgreSQL موجود از این گزینه استفاده می‌کنید، برای جلوگیری از حذف یا تغییر داده‌ها، باید از کل پایگاه داده پشتیبان تهیه نمایید.
  • create tables: این گزینه، به pgLoader می‌گوید كه جداول جدیدی را در پایگاه داده PostgreSQL هدف، بر اساس metadata موجود در پایگاه داده MySQL ایجاد كند. در صورت استفاده از گزینه opposite، یا create no tables، جداول هدف باید قبل از انتقال در پایگاه داده Postgres هدف وجود داشته باشند.

ALTER SCHEMA: به دنبال بند WITH، شما می‌توانید دستورات خاص SQL مانند این دستور را به pgLoader اضافه کنید تا اقدامات اضافی انجام شود. در اینجا، ما به pgLoader دستور می‌دهیم که طرح پایگاه داده Postgres جدید را پس از ایجاد آن، از source_db به public تغییر دهد. توجه داشته باشید که می‌توانید چنین دستوراتی را در بندهای دیگر (مانند BEFORE LOAD DO) استفاده نمایید تا به pgLoader دستور دهید که این دستورات را در نقاط خاصی از فرآیند انتقال اجرا کند.

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

 

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

postgres-server$ pgloader pgload_test.load

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

postgres-server$ sudo -u postgres psql

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

postgres=# \c new_db

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

new_db=# SELECT * FROM sample_table;
output:
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 در همان دستگاه استفاده نمایید. بدین منظور، تمام آنچه شما نیاز دارید، این است که دستور انتقال را از پروفایل کاربر لینوکس با دسترسی به کاربر اصلی MySQL اجرا کنید:

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

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

 

انتقال از یک فایل CSV

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

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

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

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

 

انتقال به یک پایگاه داده مدیریت شده PostgreSQL

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

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

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

mysql-server$ sudo apt install pgloader postgresql-client

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

 

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

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

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

mysql-server$ psql postgres://doadmin:password@db_host/defaultdb?sslmode=require

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

defaultdb=> SELECT * FROM source_db.sample_table;
output:
 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 منتقل کرده است.

 

 

 

منبع:

digitalocean