sql >> Databáze >  >> RDS >> MariaDB

Migrace Amazon RDS (MySQL nebo MariaDB) na On-Prem Server

Amazon Web Services je technologický gigant, zejména pokud jde o průkopnictví v oblasti špičkových služeb cloud computingu. Její produkty plně spravovaných služeb (Amazon RDS) jsou jediné svého druhu. Ale na druhou stranu, i když to může být perfektní platforma pro některé organizace, může být problém z ní odejít, pokud tomu tak není. Vždy existují obavy, že uvíznete v situaci, kdy je dodavatel uzamčen.

Některé věci, které je třeba mít na paměti při migraci z RDS na on-premise platformu, jsou rozpočtová omezení, zabezpečení a autonomie dat. Důvodem je to, že data jsou vaším nejcennějším aktivem a udržíte si kontrolu, ať už jsou kdekoli, je vždy nezbytné, aby organizace a společnost vždy zůstaly konkurenceschopné. Žádná organizace si nemůže dovolit cloud lock-in, a přesto se mnoho podniků ocitne přesně v této situaci a začnou poskakovat po hledání jakýchkoli alternativních existujících řešení, která lze provozovat on-prem.

Tento blog vás provede migrací z Amazon RDS na místní server. Naše cílová databáze na on-prem serveru je na linuxovém serveru RHEL/CentOS, ale příslušný postup platí i pro ostatní verze Linuxu, pokud jsou balíčky správně nainstalovány.

Existují některá existující řešení třetích stran, která nabízejí migraci dat, ale nelze je použít pro místní platformu. Navíc to není zdarma a migrace pomocí bezplatných řešení s otevřeným zdrojovým kódem je vždy příznivá a výhodná. I když existují pochybnosti a obavy, protože záruka a podpora nejsou vázány na technologie s otevřeným zdrojovým kódem, ale my vám zde ukážeme, jak toho dosáhnout jednoduchým postupem.

Protože Amazon RDS podporuje kompatibilitu s MySQL a MariaDB. V tomto blogu se na ně zaměříme.

Migrace z Amazon RDS pro MySQL nebo MariaDB

Typickým přístupem k migraci dat z Amazon RDS na místní server je vytvoření zálohy pomocí logické kopie. To lze provést pomocí řešení zálohovacích nástrojů, která jsou kompatibilní s provozem Amazon RDS, což je plně spravovaná služba. Plně spravované databázové služby nenabízejí přihlášení SSH, takže fyzická kopie záloh nepřichází v úvahu.

Použití mysqldump

Použití mysqldump musí být nainstalováno ve vašem cílovém databázovém uzlu umístěném na prem. Musí být připraven jako replika uzlu AWS RDS, takže všechny následné transakce budou replikovány do uzlu. Chcete-li to provést, postupujte podle následujících kroků.

Hostitel zdroje AWS RDS :databáze-1.xxxxxxx.us-východ-2.rds.amazonaws.com

On-Prem Server Host :192.168.10.226 (testnode26)

Před spuštěním výpisu se ujistěte, že je nastavena doba uchování binlogu. Chcete-li to nastavit, můžete to udělat jako příklad volání procedury níže ve vaší instanci Amazon RDS,

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)

Instalovat mysqldump

  1. Připravte úložiště.

# Pro MySQL

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

# Pro MariaDB

$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
  1. Instalovat balíček mysql-client

# Pro MySQL

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

# Pro MariaDB

$ yum install -y MariaDB-client
  1. Vytvořte výpis dat pomocí mysqldump jeho spuštěním v cílovém uzlu. Vezměte na vědomí, že s --master-data=2 zadaným jako volba to funguje pouze pro MariaDB, ale ne v MySQL. Takže je třeba udělat práci navíc pro MySQL. Promluvíme si o tom později.

## Použitelné pro přístup 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. Instalace serveru MySQL/MariaDB do cílového databázového uzlu

# Pro MySQL (vždy zkontrolujte, jaká verze úložiště je povolena ve vašem úložišti yum. V tuto chvíli používám MySQL 5.7)

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

# Pro MariaDB

$ yum install MariaDB-server.x86_64
  1. Nastavte instanci serveru MySQL/MariaDB (my.cnf, oprávnění k souborům, adresáře) a spusťte server 

# Nastavení my.cnf (pomocí nasazení my.cnf pomocí 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

## Resetujte datový adresář a znovu nainstalujte systémové soubory databáze

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

## Vytvořte adresáře protokolů

$ mkdir /var/log/mysql

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

## pro MySQL

$ mysqld --initialize

## Pro MariaDB

$ mysql_install_db

  1. Spuštění serveru MySQL/MariaDB

## pro MySQL

$ systemctl start mysqld

## Pro MariaDB

$ systemctl start mariadb
  1. Načíst výpis dat, který jsme převzali z AWS RDS, do cílového databázového uzlu on-prem

$ mysql --show-warnings < backups/dump.sql
  1. Vytvořte uživatele replikace ze zdrojového uzlu 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. Nastavení serveru MySQL/MariaDB jako repliky/podřízeného zdrojového uzlu AWS RDS

## Nejprve vyhledejte nebo najděte příkaz 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;

## Spusťte příkaz CHANGE MASTER, ale přidejte uživatele/heslo replikace a název hostitele následovně,

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)

## Poté spusťte podřízená vlákna

MariaDB [(none)]> START SLAVE;

Query OK, 0 rows affected (0.001 sec)

## Zkontrolujte stav slave, jak to jde

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)

Nyní, když jsme konečně byli schopni replikovat z RDS jako zdroj nebo master naší repliky umístěné na prem. Ještě není hotovo. V některých případech narazíte na chyby replikace, například      

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'

 Jelikož on-prem nepotřebuje replikovat data pocházející z databáze mysql pro tabulky s předponou 'rds%', pak tyto tabulky během replikace prostě ignorujeme. Navíc možná nebudete chtít, aby AWS RDS aktualizoval a měnil vaši tabulku mysql.user. Chcete-li to provést, můžete volitelně ignorovat schéma nebo pouze seznam tabulek, jako je,

STOP SLAVE;

Potom

SET GLOBAL replicate_wild_ignore_table='mysql.rds%';

nebo

SET GLOBAL replicate_wild_ignore_table='mysql.%';

Problém MySQL s --master-data=2

Použití mysqldump s --master-data=2 vyžaduje dostatečná oprávnění, která vyžadují oprávnění SUPER a RELOAD. Problém je v tom, že AWS RDS toto administrátorovi během nastavování a vytváření databáze nedodává. Aby bylo možné tento problém vyřešit, musí mít vaše AWS RDS nastavení master a repliku nebo slave. Jakmile budete mít nastavení slave, vezměte jej jako cílového zdrojového hostitele při použití mysqldump. Poté zastavte podřízená vlákna z repliky AWS RDS následovně,

rds-replica-mysql> CALL mysql.rds_stop_replication;

Pak vezměte mysqldump bez možnosti --master-data, jak je uvedeno níže,

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

Potom spusťte příkaz SHOW SLAVE STATUS\G ze své repliky AWS RDS a poznamenejte si  Master_Log_File a Exec_Master_Log_Pos, které použijete při připojování k hlavnímu serveru AWS RDS replikujícímu se na váš místní server. Tyto souřadnice použijte při spuštění CHANGE MASTER TO… MASTER_LOG_FILE=Master_Log_File, MASTER_LOG_POS=. Po dokončení zálohování samozřejmě nezapomeňte spustit repliku RDS, aby se znovu spustila její replikační vlákna.

rds-replica-mysql> CALL mysql.rds_start_replication;

Použití mydump

mydumper zde může být vaší alternativní možností, zejména pokud je datová sada velmi velká, protože nabízí paralelismus a rychlost při vytváření výpisu nebo záložní kopie vaší datové sady ze zdrojového uzlu RDS. Postupujte podle níže uvedených kroků od instalace mydumperu až po jeho načtení na váš cílový on-prem server.

  1. Nainstalujte binární soubor. Binární soubory lze nalézt zde 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. Vezměte zálohu ze zdrojového uzlu RDS. Například,

[[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

Nyní, v tomto okamžiku, mydumper vezme záložní soubory ve formě *.gz souborů

  1. Načtěte jej na cílový místní server

$ 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. Nastavte cílový uzel jako slave/repliku. MyDumper bude zahrnovat soubor s názvem Metadata, který se skládá z binárních souřadnic protokolu, včetně pozic GTID, například:

$ 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

## Poté spusťte master změn z repliky nebo cílového cílového databázového uzlu MySQL/MariaDB

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)

## Spustit otroka

MariaDB [jbmrcd_date]> start slave;

Query OK, 0 rows affected (0.001 sec)

V tuto chvíli jste se replikovali z instance Amazon RDS se spuštěnou MySQL/MariaDB. Jakmile bude vaše aplikace připravena přesunout se z vaší instance Amazon RDS, nastavte koncový bod směřující na váš on-prem server a všechny zbývající transakce z vaší instance RDS budou replikovány do vaší on-prem, takže žádná data nepřijdou do vašeho on- prem server.

Kontrola datových nesrovnalostí

Jakmile budete mít svá data načtena nebo uložena na místní server fungující jako replika z instance AWS RDS, měli byste to znovu zkontrolovat spuštěním výpočtů kontrolního součtu, abyste zjistili, jak daleko jsou vaše data oproti zdroj Amazon RDS. Doporučuji použít nástroj pt-table-checksum od Percona, ale můžete si vytvořit svůj vlastní pomocí nástrojů pro kontrolní součet, jako je md5 nebo sha256, ale to nějakou dobu trvá. Po dokončení migrace dat pomocí tohoto replikačního přístupu vám může pomoci také použití pt-upgrade.

Závěr

Používání mysqldump nebo mydumper jsou bezplatné nástroje s otevřeným zdrojovým kódem, což je také velká výhoda, zvláště pokud jsou vaše data velmi důvěrná a nechcete, aby k nim měla přístup třetí strana. Ačkoli může být tento přístup jednoduchý, může to být zdlouhavá a velká práce, protože vždy následuje testování a dvojité kontroly, aby se prokázalo, že migrace je plně dosažena bez jakýchkoli nekonzistencí v datech.


  1. to_sql pyodbc count pole nesprávné nebo chyba syntaxe

  2. Jak funguje ROW_NUMBER() na serveru SQL

  3. Velká písmena v názvech dnů a měsíců při formátování dat v Oracle

  4. Jak hláskovat rok při formátování data v Oracle