sql >> Database >  >> RDS >> MariaDB

Amazon RDS (MySQL of MariaDB) migreren naar een On-Prem Server

Amazon Web Services is een technologiegigant, vooral als het gaat om het pionieren op het gebied van top-of-the-line cloud computing-services. De volledig beheerde dienstenproducten (Amazon RDS) zijn uniek in hun soort. Maar aan de andere kant, hoewel het voor sommige organisaties een perfect platform kan zijn, kan het een uitdaging zijn om eruit te stappen als dat niet het geval is. Er zijn altijd zorgen om vast te zitten in een vendor lock-in situatie.

Sommige dingen om in gedachten te houden bij het migreren van RDS naar een lokaal platform zijn budgetbeperkingen, beveiliging en gegevensautonomie. Omdat gegevens uw meest waardevolle bezit zijn en de controle behouden, waar ze zich ook bevinden, is het altijd noodzakelijk voor de organisatie en het bedrijf om altijd concurrerend te blijven. Geen enkele organisatie kan het zich veroorloven om cloud-lock-in te hebben, en toch bevinden veel bedrijven zich precies in die situatie en beginnen ze te zoeken naar alternatieve bestaande oplossingen die via on-premise kunnen worden gebruikt.

In deze blog wordt uitgelegd hoe u kunt migreren van Amazon RDS naar een on-premises server. Onze doeldatabase op de lokale server bevindt zich op een RHEL/CentOS Linux-server, maar de toepasselijke procedure is van toepassing op andere versies van Linux en zolang de pakketten correct zijn geïnstalleerd.

Er zijn enkele bestaande oplossingen van derden die gegevensmigratie bieden, maar deze zijn niet van toepassing op een lokaal platform. Bovendien is het niet gratis en is gratis migreren met open source-oplossingen altijd gunstig en voordelig. Hoewel er ook twijfels en zorgen bestaan, aangezien de garantie en ondersteuning niet gebonden zijn aan open source-technologieën, maar we zullen u hier laten zien hoe u dit in een eenvoudige procedure kunt bereiken.

Aangezien Amazon RDS compatibiliteit met MySQL en MariaDB ondersteunt. We zullen ons daarop concentreren voor deze blog.

Migreren van Amazon RDS voor MySQL of MariaDB

Een typische benadering voor het migreren van uw gegevens van Amazon RDS naar een on-prem server is het maken van een back-up met een logische kopie. Dit kan worden gedaan met behulp van back-uphulpprogramma's die compatibel zijn om te werken met Amazon RDS, een volledig beheerde service. Volledig beheerde databaseservices bieden geen SSH-aanmeldingen, dus een fysieke kopie van back-ups is geen optie.

Mysqldump gebruiken

Het gebruik van mysqldump moet worden geïnstalleerd in uw doeldatabaseknooppunt op locatie. Het moet worden voorbereid als een replica van het AWS RDS-knooppunt, zodat alle volgende transacties naar het knooppunt worden gerepliceerd. Volg hiervoor de onderstaande stappen.

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

On-Prem Server Host :192.168.10.226 (testnode26)

Voordat u de dump start, moet u ervoor zorgen dat de binlog-retentie-uren zijn ingesteld. Om het in te stellen, kunt u het onderstaande voorbeeldprocedure-aanroep doen in uw Amazon RDS-instantie,

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)

Mysqldump installeren

  1. Maak de repository gereed.

# Voor MySQL

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

# Voor MariaDB

$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
  1. Mysql-client-pakket installeren

# Voor MySQL

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

# Voor MariaDB

$ yum install -y MariaDB-client
  1. Maak een gegevensdump met mysqldump door deze uit te voeren in het doelknooppunt. Let op, met --master-data=2 gespecificeerd als optie, werkt dit alleen voor MariaDB maar niet in MySQL. Er moet dus extra werk voor MySQL worden gedaan. We praten hier later over.

## Van toepassing op MariaDB-aanpak

[[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. Installeer de MySQL/MariaDB-server in het doeldatabaseknooppunt

# Voor MySQL (controleer altijd welke versierepository is ingeschakeld in uw yum-repository. Op dit moment gebruik ik MySQL 5.7)

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

# Voor MariaDB

$ yum install MariaDB-server.x86_64
  1. Stel de MySQL/MariaDB Server-instantie in (my.cnf, bestandsrechten, directory's) en start de server 

# De my.cnf instellen (met behulp van de my.cnf-implementatie door 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

## Reset de gegevensmap en installeer de databasesysteembestanden opnieuw

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

## Maak de logmappen

$ mkdir /var/log/mysql

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

## Voor MySQL

$ mysqld --initialize

## Voor MariaDB

$ mysql_install_db

  1. Start de MySQL/MariaDB-server

## Voor MySQL

$ systemctl start mysqld

## Voor MariaDB

$ systemctl start mariadb
  1. Laad de datadump die we van AWS RDS hebben gehaald naar het doeldatabaseknooppunt op locatie

$ mysql --show-warnings < backups/dump.sql
  1. Maak de replicatiegebruiker vanaf het AWS RDS-bronknooppunt

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. Stel de MySQL/MariaDB-server in als een replica/slave van het AWS RDS-bronknooppunt

## Laten we eerst het CHANGE MASTER-commando zoeken of lokaliseren

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

## Voer de CHANGE MASTER-instructie uit, maar voeg de replicatie gebruiker/wachtwoord en de hostnaam als volgt toe,

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)

## Start dan de slave-threads

MariaDB [(none)]> START SLAVE;

Query OK, 0 rows affected (0.001 sec)

## Controleer de status van de slave hoe het gaat

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)

Nu we eindelijk in staat zijn geweest om te repliceren vanuit RDS als de bron of master van onze replica op locatie. Het is nog niet gedaan. Er zijn enkele gevallen waarin u replicatiefouten tegenkomt, zoals:      

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'

 Aangezien het on-prem niet nodig is om gegevens uit de mysql-database te repliceren voor tabellen met het voorvoegsel 'rds%', negeren we deze tabellen tijdens de replicatie. Bovendien wilt u misschien niet dat AWS RDS uw mysql.user-tabel bijwerkt en wijzigt. Om dit te doen, kunt u optioneel het schema negeren of gewoon een lijst met tabellen zoals,

STOP SLAVE;

Dan,

SET GLOBAL replicate_wild_ignore_table='mysql.rds%';

of

SET GLOBAL replicate_wild_ignore_table='mysql.%';

Het MySQL-probleem met --master-data=2

Het nemen van de mysqldump met --master-data=2 vereist voldoende privileges waarvoor SUPER en RELOAD privileges nodig zijn. Het probleem is dat AWS RDS dit niet levert voor de admin-gebruiker tijdens het instellen en maken van de database. Om dit probleem te omzeilen, moet uw AWS RDS een master- en een replica- of slaveconfiguratie hebben. Als je eenmaal een slave-configuratie hebt, neem die dan als de doelbronhost bij het nemen van mysqldump. Stop vervolgens de slave-threads van uw AWS RDS-replica als volgt,

rds-replica-mysql> CALL mysql.rds_stop_replication;

Neem dan de mysqldump zonder de --master-data optie, zoals hieronder,

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

Voer vervolgens de SHOW SLAVE STATUS\G uit vanaf uw AWS RDS-replica en noteer de  Master_Log_File en Exec_Master_Log_Pos die u gaat gebruiken wanneer u verbinding maakt met de AWS RDS-master die repliceert naar uw lokale server. Gebruik deze coördinaten bij het uitvoeren van MASTER WIJZIGEN IN... MASTER_LOG_FILE=Master_Log_File, MASTER_LOG_POS=. Vergeet natuurlijk niet om uw RDS-replica te starten nadat de back-up is gemaakt om de replicatiethreads opnieuw te starten,

rds-replica-mysql> CALL mysql.rds_start_replication;

Mijndumper gebruiken

mijndumper kan hier uw alternatieve optie zijn, vooral wanneer de dataset erg groot is, omdat het parallellisme en snelheid biedt bij het nemen van een dump- of back-upkopie van uw dataset vanaf een bron-RDS-knooppunt. Volg de onderstaande stappen vanaf het installeren van de mydumper tot het laden op de on-prem-server van uw bestemming.

  1. Installeer het binaire bestand. De binaire bestanden zijn hier te vinden 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. Maak de back-up van het RDS-bronknooppunt. Bijvoorbeeld,

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

Nu, op dit punt zal mydumper een back-up van bestanden maken in de vorm van *.gz-bestanden

  1. Laad het naar de lokale server van uw bestemming

$ 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. Stel het bestemmingsknooppunt in als een slave/replica. MyDumper bevat een bestand genaamd metadata dat bestaat uit binaire logcoördinaten, waaronder GTID -posities, bijvoorbeeld:

$ 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

## Voer vervolgens een wijzigingsmaster uit vanaf de replica of uw doelbestemming MySQL/MariaDB-databaseknooppunt

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)

## Start de slave

MariaDB [jbmrcd_date]> start slave;

Query OK, 0 rows affected (0.001 sec)

Je hebt nu gerepliceerd vanaf een Amazon RDS-instantie met MySQL/MariaDB. Zodra uw toepassing klaar is om weg te gaan van uw Amazon RDS-instantie, stelt u het eindpunt in dat naar uw on-prem-server gaat en worden alle resterende transacties van uw RDS-instantie gerepliceerd naar uw on-prem, zodat er geen gegevens worden gemist die naar uw on-prem gaan. prem-server.

Controleren op gegevensverschillen

Zodra u uw gegevens hebt geladen of gedumpt naar uw on-prem server die fungeert als een replica van de AWS RDS-instantie, moet u dit dubbel controleren door checksum-berekeningen uit te voeren om te bepalen hoe ver uw gegevens zijn ten opzichte van de bron Amazon RDS. Ik raad je aan om de tool pt-table-checksum van Percona te gebruiken, maar je kunt er ook zelf een maken door checksumming-tools zoals md5 of sha256 te gebruiken, maar dit kost tijd. Bovendien kan het gebruik van pt-upgrade ook helpen nadat uw gegevensmigratie met deze replicatieaanpak is voltooid.

Conclusie

Het gebruik van mysqldump of mydumper zijn gratis open-source tools, wat ook een groot voordeel is, vooral als je gegevens erg vertrouwelijk zijn en je niet wilt dat een derde partij er toegang toe heeft. Hoewel het misschien eenvoudig is om deze benadering te volgen, kan er vervelend en groot werk bij komen kijken, aangezien er altijd tests en dubbele controles volgen om te bewijzen dat de migratie volledig wordt bereikt zonder enige inconsistentie in de gegevens.


  1. Koppeltekens in kolomnamen in MySQL DB

  2. Hoe MySQL/MariaDB-servers te beveiligen

  3. Updatebewerkingen uitvoeren op kolommen van het type JSONB in ​​Postgres 9.4

  4. Hoe SQL Server Manager Studio (SSMS) te installeren - SQL Server / TSQL-zelfstudie deel 1