MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

Memigrasikan Amazon RDS (MySQL atau MariaDB) ke Server Lokal

Amazon Web Services adalah raksasa teknologi, terutama dalam hal merintis dirinya sendiri dalam layanan komputasi awan terbaik. Produk layanan terkelola sepenuhnya (Amazon RDS) adalah salah satu dari jenisnya. Tetapi sekali lagi, meskipun ini bisa menjadi platform yang sempurna untuk beberapa organisasi, itu bisa menjadi tantangan untuk keluar darinya jika tidak. Selalu ada kekhawatiran terjebak dalam situasi penguncian vendor.

Beberapa hal yang perlu diingat saat bermigrasi dari RDS ke platform lokal adalah keterbatasan anggaran, keamanan, dan otonomi data. Ini karena data adalah aset Anda yang paling berharga dan mempertahankan kendali di mana pun ia berada, selalu penting bagi organisasi dan perusahaan untuk selalu tetap kompetitif. Tidak ada organisasi yang mampu memiliki penguncian cloud, namun, banyak perusahaan menemukan diri mereka persis dalam situasi itu dan mulai melompat mencari solusi alternatif yang ada yang dapat dioperasikan melalui lokal.

Blog ini akan memandu Anda melalui cara bermigrasi dari Amazon RDS ke server lokal. Basis data target kami di server lokal berada di server RHEL/CentOS Linux, tetapi prosedur yang berlaku akan berlaku pada versi Linux lainnya serta selama paket diinstal dengan benar.

Ada beberapa solusi pihak ketiga yang menawarkan migrasi data tetapi tidak berlaku untuk platform lokal. Selain itu, ini tidak gratis dan migrasi menggunakan gratis dengan solusi open source selalu menguntungkan dan menguntungkan. Meskipun keraguan dan kekhawatiran juga ada karena garansi dan dukungan tidak terikat dengan teknologi sumber terbuka, tetapi kami akan menunjukkan kepada Anda di sini cara mencapainya dengan prosedur yang mudah.

Karena Amazon RDS mendukung kompatibilitas dengan MySQL dan MariaDB. Kami akan fokus pada mereka untuk blog ini.

Migrasi dari Amazon RDS untuk MySQL atau MariaDB

Pendekatan umum untuk memigrasikan data Anda dari Amazon RDS ke server lokal adalah dengan mengambil cadangan menggunakan salinan logis. Ini dapat dilakukan dengan menggunakan solusi utilitas pencadangan yang kompatibel untuk beroperasi dengan Amazon RDS yang merupakan layanan yang terkelola sepenuhnya. Layanan database yang terkelola sepenuhnya tidak menawarkan login SSH sehingga salinan fisik cadangan bukanlah pilihan.

Menggunakan mysqldump

Menggunakan mysqldump harus diinstal di node database target Anda yang terletak di tempat. Itu harus disiapkan sebagai replika dari node AWS RDS sehingga semua transaksi berikutnya harus direplikasi ke node tersebut. Untuk melakukannya, ikuti langkah-langkah di bawah ini.

Host sumber AWS RDS :database-1.xxxxxxx.us-east-2.rds.amazonaws.com

Host Server Lokal :192.168.10.226 (testnode26)

Sebelum memulai dump, pastikan jam penyimpanan binlog telah disetel. Untuk mengaturnya, Anda dapat melakukan seperti contoh panggilan prosedur di bawah ini di instans Amazon RDS Anda,

mysql> call mysql.rds_set_configuration('binlog retention hours', 24);

Query OK, 2 rows affected (0.23 sec)



mysql> CALL mysql.rds_show_configuration;

+------------------------+-------+------------------------------------------------------------------------------------------------------+

| name                   | value | description                                                                                          |

+------------------------+-------+------------------------------------------------------------------------------------------------------+

| binlog retention hours | 24    | binlog retention hours specifies the duration in hours before binary logs are automatically deleted. |

+------------------------+-------+------------------------------------------------------------------------------------------------------+

1 row in set (0.23 sec)



Query OK, 0 rows affected (0.23 sec)

Instal mysqldump

  1. Siapkan repositori.

# Untuk MySQL

$ yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

# Untuk MariaDB

$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
  1. Instal paket klien-mysql

# Untuk MySQL

$ yum install -y mysql-community-client.x86_64

# Untuk MariaDB

$ yum install -y MariaDB-client
  1. Buat dump data menggunakan mysqldump dengan mengeksekusinya di dalam node target. Perhatikan, dengan --master-data=2 ditentukan sebagai opsi, ini hanya berfungsi untuk MariaDB tetapi tidak di MySQL. Jadi pekerjaan ekstra untuk MySQL harus dilakukan. Kita akan membicarakannya nanti.

## Berlaku untuk pendekatan MariaDB

[[email protected] ~]# mysqldump -h database-1.xxxxxxx.us-east-2.rds.amazonaws.com -uadmin -p --single-transaction --master-data=2 --databases db1 db2 db3  > backups/dump.sql

Enter password:

[[email protected] ~]# ls -alth backups/dump.sql

-rw-r--r--. 1 root root 196M Oct 18 02:34 backups/dump.sql
  1. Instal Server MySQL/MariaDB di node database target

# Untuk MySQL (selalu periksa repositori versi apa yang diaktifkan di repositori yum Anda. Saat ini, saya menggunakan MySQL 5.7)

$ yum --disablerepo=* --enablerepo=mysql57-community install mysql-community-common mysql-community-client mysql-community-server

# Untuk MariaDB

$ yum install MariaDB-server.x86_64
  1. Siapkan instance Server MySQL/MariaDB (my.cnf, izin file, direktori), dan mulai server 

# Menyiapkan my.cnf (menggunakan penerapan my.cnf digunakan oleh ClusterControl)

[MYSQLD]

user=mysql

basedir=/usr/

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

pid_file=/var/lib/mysql/mysql.pid

port=3306

log_error=/var/log/mysql/mysqld.log

log_warnings=2

slow_query_log_file=/var/log/mysql/mysql-slow.log

long_query_time=2

slow_query_log=OFF

log_queries_not_using_indexes=OFF

innodb_buffer_pool_size=2G

innodb_flush_log_at_trx_commit=2

innodb_file_per_table=1

innodb_data_file_path=ibdata1:100M:autoextend

innodb_read_io_threads=4

innodb_write_io_threads=4

innodb_doublewrite=1

innodb_log_file_size=256M

innodb_log_buffer_size=32M

innodb_buffer_pool_instances=1

innodb_log_files_in_group=2

innodb_thread_concurrency=0

innodb_flush_method=O_DIRECT

innodb_rollback_on_timeout=ON

innodb_autoinc_lock_mode=2

innodb_stats_on_metadata=0

default_storage_engine=innodb

server_id=1126

binlog_format=ROW

log_bin=binlog

log_slave_updates=1

relay_log=relay-bin

expire_logs_days=7

read_only=OFF

report_host=192.168.10.226

key_buffer_size=24M

tmp_table_size=64M

max_heap_table_size=64M

max_allowed_packet=512M

skip_name_resolve=true

memlock=0

sysdate_is_now=1

max_connections=500

thread_cache_size=512

query_cache_type=0

query_cache_size=0

table_open_cache=1024

lower_case_table_names=0

performance_schema=OFF

performance-schema-max-mutex-classes=0

performance-schema-max-mutex-instances=0



[MYSQL]

socket=/var/lib/mysql/mysql.sock



[client]

socket=/var/lib/mysql/mysql.sock



[mysqldump]

socket=/var/lib/mysql/mysql.sock

max_allowed_packet=512M

## Atur ulang direktori data dan instal ulang file sistem database

$ rm -rf /var/lib/mysql/*

## Buat direktori log

$ mkdir /var/log/mysql

$ chown -R mysql.mysql /var/log/mysql

## Untuk MySQL

$ mysqld --initialize

## Untuk MariaDB

$ mysql_install_db

  1. Mulai Server MySQL/MariaDB

## Untuk MySQL

$ systemctl start mysqld

## Untuk MariaDB

$ systemctl start mariadb
  1. Muat dump data yang telah kami ambil dari AWS RDS ke node database target di tempat

$ mysql --show-warnings < backups/dump.sql
  1. Buat pengguna replikasi dari node sumber AWS RDS

MariaDB [(none)]> CREATE USER 'repl_user'@'149.145.213.%' IDENTIFIED BY 'repl_passw0rd';

Query OK, 0 rows affected (0.242 sec)



MariaDB [(none)]>  GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO repl_user'@'149.145.213.%'  IDENTIFIED BY 'repl_passw0rd' ;

Query OK, 0 rows affected (0.229 sec)
  1. Siapkan Server MySQL/MariaDB sebagai replika/budak dari node sumber AWS RDS

## Pertama, mari kita cari atau temukan perintah CHANGE MASTER

[[email protected] ~]# grep -rn -E -i 'change master to master' backups/dump.sql |head -1

22:-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.000584', MASTER_LOG_POS=421;

## Jalankan pernyataan CHANGE MASTER tetapi tambahkan pengguna/sandi replikasi dan nama host sebagai berikut,

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='database-1.xxxxxxx.us-east-2.rds.amazonaws.com', MASTER_LOG_FILE='mysql-bin-changelog.000584', MASTER_LOG_POS=421, MASTER_USER='repl_user', MASTER_PASSWORD='repl_passw0rd';

Query OK, 0 rows affected (0.004 sec)

## Kemudian mulai utas slave

MariaDB [(none)]> START SLAVE;

Query OK, 0 rows affected (0.001 sec)

## Periksa status budak bagaimana kelanjutannya

MariaDB [(none)]> SHOW SLAVE STATUS \G

*************************** 1. row ***************************

                Slave_IO_State: Waiting for master to send event

                   Master_Host: database-1.xxxxxxx.us-east-2.rds.amazonaws.com

                   Master_User: repl_user

                   Master_Port: 3306

                 Connect_Retry: 60

               Master_Log_File: mysql-bin-changelog.000584

           Read_Master_Log_Pos: 421

                Relay_Log_File: relay-bin.000001

                 Relay_Log_Pos: 4

         Relay_Master_Log_File: mysql-bin-changelog.000584

              Slave_IO_Running: Yes

             Slave_SQL_Running: Yes

               Replicate_Do_DB:

           Replicate_Ignore_DB:

            Replicate_Do_Table:

        Replicate_Ignore_Table:

       Replicate_Wild_Do_Table:

   Replicate_Wild_Ignore_Table:

                    Last_Errno: 0

                    Last_Error:

                  Skip_Counter: 0

           Exec_Master_Log_Pos: 421

               Relay_Log_Space: 256

               Until_Condition: None

                Until_Log_File:

                 Until_Log_Pos: 0

            Master_SSL_Allowed: No

            Master_SSL_CA_File:

            Master_SSL_CA_Path:

               Master_SSL_Cert:

             Master_SSL_Cipher:

                Master_SSL_Key:

         Seconds_Behind_Master: 0

 Master_SSL_Verify_Server_Cert: No

                 Last_IO_Errno: 0

                 Last_IO_Error:

                Last_SQL_Errno: 0

                Last_SQL_Error:

   Replicate_Ignore_Server_Ids:

              Master_Server_Id: 1675507089

                Master_SSL_Crl:

            Master_SSL_Crlpath:

                    Using_Gtid: No

                   Gtid_IO_Pos:

       Replicate_Do_Domain_Ids:

   Replicate_Ignore_Domain_Ids:

                 Parallel_Mode: optimistic

                     SQL_Delay: 0

           SQL_Remaining_Delay: NULL

       Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

              Slave_DDL_Groups: 0

Slave_Non_Transactional_Groups: 0

    Slave_Transactional_Groups: 0

1 row in set (0.000 sec)

Sekarang kami akhirnya dapat mereplikasi dari RDS sebagai sumber atau master replika kami yang berlokasi di tempat. Ini belum selesai. Ada beberapa kasus Anda akan menemukan kesalahan replikasi seperti,      

Last_SQL_Errno: 1146

                Last_SQL_Error: Error 'Table 'mysql.rds_heartbeat2' doesn't exist' on query. Default database: 'mysql'. Query: 'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1602988485784) ON DUPLICATE KEY UPDATE value = 1602988485784'

 Karena lokal tidak perlu mereplikasi data yang berasal dari database mysql untuk tabel yang diawali dengan 'rds%', maka kami mengabaikan tabel ini selama replikasi. Selain itu, Anda mungkin tidak ingin AWS RDS memperbarui dan mengubah tabel mysql.user Anda. Untuk melakukan ini, Anda dapat mengabaikan skema atau hanya daftar tabel seperti,

STOP SLAVE;

Lalu,

SET GLOBAL replicate_wild_ignore_table='mysql.rds%';

atau

SET GLOBAL replicate_wild_ignore_table='mysql.%';

Masalah MySQL Dengan --master-data=2

Mengambil mysqldump dengan --master-data=2 membutuhkan hak yang cukup yang membutuhkan hak SUPER dan RELOAD. Masalahnya adalah, AWS RDS tidak menyediakan ini untuk pengguna admin selama penyiapan dan pembuatan basis data. Untuk mengatasi masalah ini, AWS RDS Anda harus memiliki pengaturan master dan replika atau slave. Setelah Anda memiliki pengaturan budak, anggap itu sebagai host sumber target saat mengambil mysqldump. Kemudian hentikan utas slave dari replika AWS RDS Anda sebagai berikut,

rds-replica-mysql> CALL mysql.rds_stop_replication;

Kemudian ambil mysqldump tanpa opsi --master-data seperti di bawah ini,

mysqldump -h database-1.xxxxxxx.us-east-2.rds.amazonaws.com -uadmin -p --single-transaction --databases db1 db2 db3  > backups/dump.sql

Kemudian jalankan SHOW SLAVE STATUS\G dari replika AWS RDS Anda dan catat Master_Log_File dan Exec_Master_Log_Pos yang akan Anda gunakan saat menghubungkan ke master AWS RDS yang mereplikasi ke server lokal Anda. Gunakan koordinat tersebut saat menjalankan CHANGE MASTER TO… MASTER_LOG_FILE=Master_Log_File, MASTER_LOG_POS=. Tentu saja, setelah pencadangan selesai, jangan lupa untuk memulai replika RDS Anda untuk memulai utas replikasinya lagi,

rds-replica-mysql> CALL mysql.rds_start_replication;

Menggunakan mydumper

mydumper dapat menjadi pilihan alternatif Anda di sini terutama ketika dataset sangat besar karena menawarkan paralelisme dan kecepatan saat mengambil salinan dump atau backup dataset Anda dari node RDS sumber. Ikuti langkah-langkah di bawah ini mulai dari menginstal mydumper hingga memuatnya ke server lokal tujuan Anda.

  1. Instal biner. Binari dapat ditemukan di sini https://github.com/maxbube/mydumper/releases.

 $ yum install https://github.com/maxbube/mydumper/releases/download/v0.9.5/mydumper-0.9.5-2.el6.x86_64.rpm
  1. Ambil cadangan dari node sumber RDS. Misalnya,

[[email protected] mydumper-2]# /usr/bin/mydumper --outputdir=. --verbose=3 --host=database-1.xxxxxxx.us-east-2.rds.amazonaws.com --port=3306 --kill-long-queries --chunk-filesize=5120 --build-empty-files --events --routines --triggers --compress --less-locking --success-on-1146 --regex='(db1\.|db2\.|db3\.|mydb4\.|testdb5\.)' -u admin --password=admin123

** Message: Connected to a MySQL server



** (mydumper:18904): CRITICAL **: Couldn't acquire global lock, snapshots will not be consistent: Access denied for user 'admin'@'%' (using password: YES)

** Message: Started dump at: 2020-10-18 09:34:08



** Message: Written master status

** Message: Multisource slave detected.

** Message: Thread 5 connected using MySQL connection ID 1109

Sekarang, pada tahap ini, mydumper akan mengambil file cadangan berupa *.gz file

  1. Muat ke server lokal tujuan Anda

$ myloader --host localhost --directory=$(pwd) --queries-per-transaction=10000 --threads=8 --compress-protocol --verbose=3

** Message: 8 threads created

** Message: Creating database `db1`

** Message: Creating table `db1`.`folders_rel`

** Message: Creating table `db2`.`p`

** Message: Creating table `db2`.`t1`

** Message: Creating table `db3`.`AddressCodeTest`
  1. Siapkan node tujuan sebagai budak/replika. MyDumper akan menyertakan file yang disebut metadata yang terdiri dari koordinat log biner termasuk posisi GTID, misalnya:

$ cat metadata

Started dump at: 2020-10-18 10:23:35

SHOW MASTER STATUS:

        Log: mysql-bin-changelog.000680

        Pos: 676

        GTID:0-1675507089-3044

## Kemudian jalankan master perubahan dari replika atau node database MySQL/MariaDB tujuan target Anda

MariaDB [jbmrcd_date]> CHANGE MASTER TO MASTER_HOST='database-1.cmu8qdlvkepg.us-east-2.rds.amazonaws.com', MASTER_USER='repl_user', MASTER_PASSWORD='repl_passw0rd',  MASTER_LOG_FILE='mysql-bin-changelog.000680', MASTER_LOG_POS

=676;

Query OK, 0 rows affected (0.002 sec)

## Mulai slave

MariaDB [jbmrcd_date]> start slave;

Query OK, 0 rows affected (0.001 sec)

Pada titik ini, Anda sekarang telah mereplikasi dari instans Amazon RDS yang menjalankan MySQL/MariaDB. Setelah aplikasi Anda siap untuk pindah dari instans Amazon RDS Anda, atur titik akhir ke server lokal Anda dan semua transaksi yang tersisa dari instans RDS Anda akan direplikasi ke lokal Anda tanpa meninggalkan data yang terlewat masuk ke jaringan Anda. server utama.

Periksa Perbedaan Data

Setelah data Anda dimuat atau dibuang ke server lokal yang bertindak sebagai replika dari instans AWS RDS, Anda harus memeriksa ulang ini dengan menjalankan penghitungan checksum untuk menentukan seberapa jauh data Anda bertentangan dengan sumber Amazon RDS. Saya sarankan Anda menggunakan alat pt-table-checksum oleh Percona, tetapi Anda dapat membuatnya sendiri dengan menggunakan alat checksumming seperti md5 atau sha256 tetapi ini membutuhkan waktu untuk melakukannya. Selain itu, menggunakan pt-upgrade juga dapat membantu setelah migrasi data Anda menggunakan pendekatan replikasi ini selesai.

Kesimpulan

Menggunakan mysqldump atau mydumper adalah alat sumber terbuka gratis yang juga merupakan keuntungan besar terutama jika data Anda sangat rahasia dan Anda tidak ingin pihak ketiga mengaksesnya. Meskipun mungkin sederhana untuk mengambil pendekatan ini, mungkin ada pekerjaan besar dan membosankan yang dapat dilibatkan karena pengujian dan pemeriksaan ganda selalu mengikuti untuk membuktikan bahwa migrasi tercapai sepenuhnya tanpa inkonsistensi data.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menghentikan atau Memperlambat Operasi SST pada Cluster Galera

  2. Bagaimana SPACE() Bekerja di MariaDB

  3. Cara Mengatasi Data Terhapus Secara Tidak Sengaja di MySQL &MariaDB

  4. Bagaimana WEEK() Bekerja di MariaDB

  5. Bagaimana EXPORT_SET() Bekerja di MariaDB