sql >> Databasteknik >  >> RDS >> MariaDB

Migrera Amazon RDS (MySQL eller MariaDB) till en lokal server

Amazon Web Services är en teknikjätte, särskilt när det kommer till att vara banbrytande inom top-of-the-line molntjänster. Dess helt hanterade tjänsteprodukter (Amazon RDS) är unika. Men även om det kan vara en perfekt plattform för vissa organisationer, kan det vara en utmaning att gå ut från det om det inte är det. Det finns alltid oro för att fastna i en leverantörslåsningssituation.

Några saker att tänka på när du migrerar från RDS till en lokal plattform är budgetbegränsningar, säkerhet och dataautonomi. Detta beror på att data är din mest värdefulla tillgång och att behålla kontrollen var den än finns är det alltid absolut nödvändigt för organisationen och företaget att alltid förbli konkurrenskraftiga. Ingen organisation har råd att ha molnlåsning, och ändå befinner sig många företag i exakt den situationen och börjar leta efter alternativa befintliga lösningar som kan användas på plats.

Den här bloggen går igenom hur du migrerar från Amazon RDS och går till en lokal server. Vår måldatabas på den lokala servern är på en RHEL/CentOS Linux-server, men tillämplig procedur ska gälla för andra versioner av Linux så länge som paketen är korrekt installerade.

Det finns vissa befintliga lösningar från tredje part som erbjuder datamigrering men det är inte tillämpligt för en lokal plattform. Dessutom är det inte gratis och att migrera med gratislösningar med öppen källkod är alltid fördelaktigt och fördelaktigt. Även om tvivel och farhågor också finns eftersom garantin och supporten inte är bunden till öppen källkodsteknik, men vi kommer att visa dig här hur du uppnår detta på ett enkelt sätt.

Eftersom Amazon RDS stöder kompatibilitet med MySQL och MariaDB. Vi kommer att fokusera på dem för den här bloggen.

Migrerar från Amazon RDS för MySQL eller MariaDB

En typisk metod för att migrera dina data från Amazon RDS till en lokal server är att ta en säkerhetskopia med en logisk kopia. Detta kan göras med hjälp av säkerhetskopieringsverktyg som är kompatibla med Amazon RDS som är en helt hanterad tjänst. Fullt hanterade databastjänster erbjuder inte SSH-inloggningar så fysisk kopia av säkerhetskopior är inte ett alternativ.

Använda mysqldump

Att använda mysqldump måste installeras i din måldatabasnod som finns på plats. Den måste förberedas som en kopia av AWS RDS-noden så alla efterföljande transaktioner ska replikeras till noden. För att göra detta, följ stegen nedan.

AWS RDS-källvärd :database-1.xxxxxxxx.us-east-2.rds.amazonaws.com

On-Prem Server Host :192.168.10.226 (testnode26)

Innan du startar dumpningen, se till att lagringstiderna för binlog är inställda. För att ställa in det kan du göra som exempel på proceduranropet nedan i din Amazon RDS-instans,

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)

Installera mysqldump

  1. Förbered arkivet.

# för MySQL

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

# För MariaDB

$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
  1. Installera mysql-client-paketet

# För MySQL

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

# För MariaDB

$ yum install -y MariaDB-client
  1. Skapa en datadump med mysqldump genom att köra den inuti målnoden. Notera, med --master-data=2 angivet som ett alternativ, detta fungerar bara för MariaDB men inte i MySQL. Så extraarbete för MySQL måste göras. Vi pratar om detta senare.

## Tillämplig för MariaDB-metoden

[[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. Installera MySQL/MariaDB-servern i måldatabasnoden

# För MySQL (kolla alltid vilken versionsförråd som är aktiverat i ditt yum-förråd. Vid det här laget använder jag MySQL 5.7)

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

# För MariaDB

$ yum install MariaDB-server.x86_64
  1. Ställ in MySQL/MariaDB Server-instansen (my.cnf, filbehörigheter, kataloger) och starta servern 

# Konfigurera my.cnf (med my.cnf-distributionen som används av 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

## Återställ datakatalogen och installera om databassystemfilerna

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

## Skapa loggkatalogerna

$ mkdir /var/log/mysql

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

## för MySQL

$ mysqld --initialize

## För MariaDB

$ mysql_install_db

  1. Starta MySQL/MariaDB-servern

## för MySQL

$ systemctl start mysqld

## För MariaDB

$ systemctl start mariadb
  1. Ladda datadumpen som vi har tagit från AWS RDS till måldatabasnoden on-prem

$ mysql --show-warnings < backups/dump.sql
  1. Skapa replikeringsanvändaren från AWS RDS-källnoden

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. Ställ in MySQL/MariaDB-servern som en replik/slav av AWS RDS-källnoden

## Låt oss först söka eller hitta kommandot 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;

## Kör CHANGE MASTER-satsen men lägg till replikeringsanvändaren/lösenordet och värdnamnet enligt följande,

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)

## Starta sedan slavtrådarna

MariaDB [(none)]> START SLAVE;

Query OK, 0 rows affected (0.001 sec)

## Kontrollera slavstatusen hur det går

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 när vi äntligen har kunnat replikera från RDS som källan eller mastern för vår replika lokaliserad. Det är inte gjort än. Det finns vissa fall du kommer att stöta på replikeringsfel som      

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'

 Eftersom on-prem inte behöver replikera data som kommer från mysql-databasen för tabeller med prefixet 'rds%', så ignorerar vi bara dessa tabeller under replikering. Dessutom kanske du inte vill att AWS RDS ska uppdatera och ändra din mysql.user-tabell. För att göra detta kan du valfritt ignorera schemat eller bara lista med tabeller som,

STOP SLAVE;

Så,

SET GLOBAL replicate_wild_ignore_table='mysql.rds%';

eller

SET GLOBAL replicate_wild_ignore_table='mysql.%';

MySQL-problemet med --master-data=2

Att ta mysqldump med --master-data=2 kräver tillräckliga privilegier vilket kräver SUPER- och RELOAD-behörigheter. Problemet är att AWS RDS inte tillhandahåller detta för administratörsanvändaren under installation och skapande av databasen. För att komma runt det här problemet måste det vara att din AWS RDS har en master- och en replika- eller slavinstallation. När du väl har en slavinstallation, ta den som målkällvärd när du tar mysqldump. Stoppa sedan slavtrådarna från din AWS RDS-replika enligt följande,

rds-replica-mysql> CALL mysql.rds_stop_replication;

Ta sedan mysqldump utan --master-data-alternativet precis som nedan,

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

Kör sedan SHOW SLAVE STATUS\G från din AWS RDS-replik och notera Master_Log_File och Exec_Master_Log_Pos som du kommer att använda för när du ansluter till AWS RDS-master som replikerar till din lokala server. Använd dessa koordinater när du kör CHANGE MASTER TO... MASTER_LOG_FILE=Master_Log_File, MASTER_LOG_POS=. Naturligtvis, när säkerhetskopieringen har gjorts, glöm inte att starta din RDS-replik för att starta replikeringstrådarna igen,

rds-replica-mysql> CALL mysql.rds_start_replication;

Använda mydumper

mydumper kan vara ditt alternativa alternativ här, särskilt när datamängden är mycket stor eftersom den erbjuder parallellitet och hastighet när du tar en dump eller säkerhetskopia av din datauppsättning från en RDS-källnod. Följ stegen nedan från installation av mydumper till att ladda den till din lokala destinationsserver.

  1. Installera binären. Binärfilerna finns här 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. Ta säkerhetskopian från RDS-källnoden. Till exempel,

[[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, vid denna tidpunkt, kommer mydumper att ta en säkerhetskopia av filer i form av *.gz-filer

  1. Ladda den till din destinationsserver på plats

$ 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. Ställ in destinationsnoden som en slav/replika. MyDumper kommer att innehålla en fil som heter Metadata som består av binära logkkoordinater inklusive GTID -positioner, till exempel:

$ 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

## Kör sedan en ändringsmaster från repliken eller din måldestinationsnod 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)

## Starta slaven

MariaDB [jbmrcd_date]> start slave;

Query OK, 0 rows affected (0.001 sec)

Vid det här laget har du nu replikerat från en Amazon RDS-instans som kör MySQL/MariaDB. När din applikation är redo att flytta bort från din Amazon RDS-instans, ställ in slutpunkten som går till din lokala server och alla återstående transaktioner från din RDS-instans kommer att replikeras till din lokala så att ingen data saknas som går till din on-prem-instans. prem-server.

Kontrollera efter dataavvikelser

När du har din data laddad eller dumpad till din lokala server som fungerar som en replik från AWS RDS-instansen, bör du dubbelkolla detta genom att köra checksummeberäkningar för att avgöra hur långt din data ligger mot källa Amazon RDS. Jag föreslår att du använder verktyget pt-table-checksum från Percona, men du kan skapa ditt eget genom att använda kontrollsummarverktyg som md5 eller sha256, men det tar tid att göra. Dessutom kan användningen av pt-upgrade hjälpa till efter att din datamigrering med denna replikeringsmetod är klar.

Slutsats

Att använda mysqldump eller mydumper är gratis verktyg med öppen källkod vilket också är en stor fördel, särskilt om din data är mycket konfidentiell och du inte vill att en tredje part ska få tillgång till den. Även om det kan vara enkelt att ta det här tillvägagångssättet kan det vara tråkigt och stort arbete som kan vara inblandat eftersom tester och dubbelkontroller alltid följer för att bevisa att migreringen är helt genomförd utan några datainkonsekvenser.


  1. Felsökning AlwaysOn – Ibland krävs många uppsättningar ögon

  2. listview visa data från databasen i Android

  3. Hantera långsamma frågor med PostgreSQL

  4. Hur kan jag använda mysqli_fetch_array() två gånger?