sql >> Databasteknik >  >> RDS >> MariaDB

Migrera Azure Database for MySQL/MariaDB till en lokal server

Databasmigreringar kan innebära enorma utmaningar när du tänker på hur du ska börja, vilka verktyg du ska använda och hur du kan uppnå en fullständig databasmigrering framgångsrikt. Tidigare har vi listat den bästa öppna källkoden du kan använda vid migrering för MySQL eller MariaDB. I den här bloggen visar vi dig hur du migrerar data från Microsoft Azure Database for MySQL eller MariaDB.

Microsoft Azure är nu känt för att vara en utmanare mot de två andra molnteknikjättarna:AWS och Google Cloud. Det specialiserar sig på fler av sina Microsoft-produkter, speciellt deras egenutvecklade MSSQL-databas. Men inte bara det, den har också öppna källor som en av deras helt hanterade tjänstedatabaser att erbjuda offentligt. Bland dess stödda databaser finns MySQL och MariaDB.

Att flytta ut från Azure Database för MySQL/MariaDB kan vara tråkigt men det beror på vilken typ av arkitektur och vilken typ av datauppsättning du har värd i din Azure som din nuvarande molnleverantör. Med rätt verktyg kan det vara möjligt och en fullständig migrering kan göras.

Vi kommer att fokusera på verktygen vi kan använda för datamigreringar på MySQL eller MariaDB. För den här bloggen använder jag RHEL/CentOS för att installera de nödvändiga paketen. Låt oss gå över och definiera stegen och procedurerna för hur man gör detta.

Migrera från Azure Database for MySQL eller MariaDB

En typisk metod för att migrera dina data från Azure Database 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 att arbeta med Azure Database for MySQL eller MariaDB 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.

Innan du kan migrera eller dumpa din befintliga databas från Azure måste du tänka på följande.

Vanliga användningsfall för dumpning och återställning på plats

De vanligaste användningsfallen är:

  • Att använda logisk säkerhetskopiering (som mysqldump, mysqlpump eller mydumper/myloader) och återställning är det enda alternativet. Azure Database for MySQL eller MariaDB stöder inte fysisk åtkomst till den fysiska lagringen eftersom detta är en fullständigt hanterad databastjänst.
  • Stöder endast InnoDB- och minneslagringsmotorer. Migrera från alternativa lagringsmotorer till InnoDB. Azure Database for MySQL eller MariaDB stöder endast InnoDB Storage-motor och stöder därför inte alternativa lagringsmotorer. Om dina tabeller är konfigurerade med andra lagringsmotorer, konvertera dem till InnoDB-motorformatet innan migreringen till Azure Database for MySQL.
  • Om du till exempel har en WordPress eller WebApp som använder MyISAM-tabellerna, konvertera först dessa tabeller genom att migrera till InnoDB-format innan du återställer till Azure Database for MySQL. Använd satsen ENGINE=InnoDB för att ställa in motorn som används när du skapar en ny tabell, överför sedan data till den kompatibla tabellen före återställningen.
  • Om din Azure-källdatabas finns på en specifik version, har din målserver också varit samma version som Azure-källdatabasen.

Så med dessa begränsningar förväntar du dig bara att dina data från Azure måste vara InnoDB-lagringsmotor eller minne, om det finns sådana i din datauppsättning.

Prestandaöverväganden för att ta logisk säkerhetskopiering från Azure Database

Det enda sättet att ta en logisk säkerhetskopia med Azure är att använda mysqldump eller mysqlpump. För att optimera prestandan när du tar en dumpning med dessa verktyg bör du tänka på följande när du dumpar stora databaser:

  • Använd alternativet exclude-triggers i mysqldump när du dumpar databaser. Uteslut triggers från dumpfiler för att undvika att triggerkommandona aktiveras under dataåterställningen.
  • Använd alternativet för en transaktion för att ställa in transaktionsisoleringsläget till REPEATABLE READ och skicka en START TRANSACTION SQL-sats till servern innan du dumpar data. Att dumpa många tabeller inom en enda transaktion gör att en del extra lagringsutrymme förbrukas under återställning. Alternativet för en transaktion och alternativet för låsta tabeller är ömsesidigt uteslutande eftersom LOCK TABLES gör att alla pågående transaktioner genomförs implicit. För att dumpa stora tabeller, kombinera alternativet för en transaktion med snabbalternativet.
  • Använd syntaxen för utökad infogning av flera rader som innehåller flera VALUE-listor. Detta resulterar i en mindre dumpfil och snabbare infogning när filen laddas om.
  • Använd alternativet order-by-primary i mysqldump när du dumpar databaser, så att data skriptas i primärnyckelordning.
  • Använd alternativet disable-keys i mysqldump när du dumpar data, för att inaktivera begränsningar för främmande nycklar före laddning. Att inaktivera kontroller av främmande nyckel ger prestandavinster. Aktivera begränsningarna och verifiera data efter laddningen för att säkerställa referensintegritet.
  • Använd partitionerade tabeller när det är lämpligt.
  • Ladda data parallellt. Undvik för mycket parallellitet som skulle få dig att nå en resursgräns och övervaka resurser med hjälp av mätvärdena som finns tillgängliga i Azure-portalen.
  • Använd alternativet defer-table-indexes i mysqlpump när du dumpar databaser, så att index skapas efter att tabellens data har laddats.
  • Använd skip-definer-alternativet i mysqlpump för att utelämna definier- och SQL SECURITY-satser från skapa-satserna för vyer och lagrade procedurer. När du laddar om dumpfilen skapar den objekt som använder standardvärdena DEFINER och SQL SECURITY.
  • Kopiera säkerhetskopieringsfilerna till en Azure-blob/butik och utför återställningen därifrån, vilket borde vara mycket snabbare än att utföra återställningen över Internet.

Stöds inte

Följande stöds inte:

  • DBA-roll:Begränsad. Alternativt kan du använda administratörsanvändaren (som skapades när en ny server skapades), som låter dig utföra de flesta DDL- och DML-satser.
  • SUPER-behörighet:På samma sätt är SUPER-behörighet begränsad.
  • DEFINER:Kräver superprivilegier för att skapa och är begränsad. Om du importerar data med hjälp av en säkerhetskopia, ta bort CREATE DEFINER-kommandona manuellt eller genom att använda kommandot --skip-definer när du utför en mysqldump.
  • Systemdatabaser:Mysql-systemdatabasen är skrivskyddad och används för att stödja olika PaaS-funktioner. Du kan inte göra ändringar i mysql-systemets databas.
  • VÄLJ ... INTO UTFIL:Stöds inte i tjänsten.

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 replik av Azure Database-noden så att alla efterföljande transaktioner ska replikeras till noden. För att göra detta, följ stegen nedan.

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.

$ MYSQL_PWD=<YOUR_MYSQL_PASS> mysqldump -h<YOUR_AZURE_DB_HOSTNAME>  -u<YOUR_AZURE_USERNAME> --single-transaction --master-data=2 --extended-insert --order-by-primary --disable-keys --databases maximusdb db2 db3 > backups/dump.sql
  1. Installera MySQL/MariaDB-servern i måldatabasnoden

# för MySQL

$  yum install mysql-community-server.x86_64 mysql-community-client mysql-community-common

# 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. Läs in datadumpen som vi har tagit från Azure Database till måldatabasnoden på plats

$ mysql --show-warnings < backups/dump.sql
  1. Skapa replikeringsanvändaren från din Azure Database-källnod

CREATE USER 'repl_user'@'<your-target-node-ip>' IDENTIFIED BY 'repl_passw0rd';

GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO [email protected]'<your-target-node-ip>' IDENTIFIED BY 'repl_passw0rd';

Se till att du ändrar IP-adressen för din målnods IP-adress som klienten att ansluta från.

  1. Konfigurera MySQL/MariaDB-servern som en replika/slav av Azure Database-källnoden

## Låt oss först söka eller hitta kommandot CHANGE MASTER

$ grep -rn -E -i 'change master to master' backups/dump.sql |head -1

22:-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=2938610;

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

CHANGE MASTER TO MASTER_HOST='<YOUR_AZURE_DB_HOSTNAME>', MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=2938610, MASTER_USER='repl_user', MASTER_PASSWORD='repl_passw0rd';

## I vissa fall kan du behöva ignorera mysql-schemat. Kör följande programsats:

SET GLOBAL replicate_wild_ignore_table='mysql.%';

## Starta sedan slavtrådarna

START SLAVE;

## Kontrollera slavstatusen hur det går

SHOW SLAVE STATUS \G

Nu när vi äntligen har kunnat replikera från Azure Database antingen för MySQL/MariaDB som källan till din replika lokaliserad.

Använda mydumper

Azure Database for MySQL eller MariaDB tyder faktiskt på att användning av mydumper speciellt för stora säkerhetskopior som 1TB kan vara ditt alternativa alternativ. Det erbjuder parallellitet och hastighet när du tar en dump eller säkerhetskopia av din datauppsättning från en källnod för Azure Database.

 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 Azure Database-källnoden. Till exempel,

[[email protected] mydumper]# MYSQL_PWD=<YOUR_AZURE_DB_PASSWORD> /usr/bin/mydumper --outputdir=. --verbose=3 --host=<YOUR_AZURE_DB_HOSTNAME>  -u <YOUR_AZURE_USER>@<YOUR_AZURE_DB_HOSTNAME> --port=3306 --kill-long-queries --chunk-filesize=5120 --build-empty-files --events --routines --triggers --compress --less-locking --success-on-1146 --regex='(maximusdb\.|db1\.|db2\.)'

** Message: Connected to a MySQL server

** Message: Using Percona Backup Locks



** (mydumper:28829): CRITICAL **: Couldn't acquire LOCK BINLOG FOR BACKUP, snapshots will not be consistent: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'BINLOG FOR BACKUP' at line 1

** Message: Started dump at: 2020-10-26 01:34:05



** Message: Written master status

** Message: Multisource slave detected.

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

** Message: Thread 6 connected using MySQL connection ID 64345

** Message: Thread 7 connected using MySQL connection ID 64275

** Message: Thread 8 connected using MySQL connection ID 64283

** Message: Thread 1 connected using MySQL connection ID 64253

** Message: Thread 2 connected using MySQL connection ID 64211

** Message: Thread 3 connected using MySQL connection ID 64200

** Message: Thread 4 connected using MySQL connection ID 64211



** (mydumper:28829): CRITICAL **: Error: DB: mysql - Could not execute query: Access denied for user 'mysqldbadmin'@'%' to database 'mysql'

** Message: Thread 5 shutting down

** Message: Thread 6 shutting down

** Message: Thread 7 shutting down

** Message: Thread 8 shutting down

** Message: Thread 1 dumping data for `db1`.`TB1`

** Message: Thread 2 dumping data for `db1`.`tb2

….

Som du kan se finns det en begränsning för att säkerhetskopiera från en hanterad databas som Azure. Du kanske märker,

** (mydumper:28829): CRITICAL **: Couldn't acquire LOCK BINLOG FOR BACKUP, snapshots will not be consistent: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'BINLOG FOR BACKUP' at line 1

Detta beror på att SUPER PRIVILEGE inte stöds eller är begränsad. Helst är det bästa alternativet att göra detta att ta säkerhetskopian från en replik av din Azure-databas. Vi kommer att prata om detta senare.

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 `maximusdb`

** Message: Creating table `maximusdb`.`usertbl`

** Message: Creating table `maximusdb`.`familytbl`

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

** Message: Creating table `db3`.`test1`

…

….
  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-26 01:35:12

SHOW MASTER STATUS:

        Log: mysql-bin.000007

        Pos: 801

        GTID:0-3649485694-1705



Finished dump at: 2020-10-26 01:37:12

## Kör sedan en ändringsmaster från repliken eller din måldestinationsnod MySQL/MariaDB

CHANGE MASTER TO MASTER_HOST='<YOUR_AZURE_DB_HOSTNAME>', MASTER_LOG_FILE='mysql-bin.000007', MASTER_LOG_POS=801, MASTER_USER='repl_user', MASTER_PASSWORD='repl_passw0rd';

## Starta slaven

START SLAVE;

Vid det här laget har du nu replikerat från en Azure Database-instans som kör MySQL/MariaDB. När din applikation är redo att flytta bort från din Azure Database-instans, konfigurerar du slutpunkten som går till din lokala server och alla återstående transaktioner från din Azure-instans kommer att replikeras till din lokala och lämnar ingen data som missas som går till din on-prem. prem-server.

Hantera begränsningar med hanterade databaser för MySQL eller MariaDB i Azure

Att hantera begränsningar, särskilt när du tar en säkerhetskopieringsdump av din datauppsättning, måste vara 100 % korrekt från den tidpunkt då du har tagit backupdumpen. Naturligtvis är detta en idealisk migrering till din lokala plats. För att hantera detta är den bästa arkitekturinställningen att ha en replikeringstopologi i din Azure-databas.

När du har den och redo för migrering måste mysqldump/mysqlpump eller mydumper använda Azure Database-repliken som sin källa. Inom den Azure Database-repliken, se till att SQL_THREAD är stoppad så att du kan ögonblicksbilda eller spela in rätt MASTER_LOG_FILE och EXEC_MASTER_LOG_POS från resultatet av SHOW SLAVE STATUS.

Glöm naturligtvis inte att starta din Azure Database-replik för att starta replikeringstrådarna igen när säkerhetskopieringen har gjorts.

Kontrollera efter dataavvikelser

När du har din data laddad eller dumpad till din lokala server som fungerar som en replik från Azure Database-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 Azure Database. Vi föreslår att du använder pt-table-checksum-verktyget från Percona Toolkit, 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ändning av pt-upgrade från Percona Toolkit hjälpa till efter att din datamigrering med denna replikeringsmetod är klar.

Slutsats

Begränsningar av privilegier och typer som inte stöds från Azure Database kan vara utmanande men med lämpligt flöde och arkitektur är det inte omöjligt att migrera från en helt hanterad databas på plats. Allt du behöver göra är att förbereda de nödvändiga stegen, ställa in den nödvändiga topologin från din Azure Database-källa och sedan starta migreringen från att ta säkerhetskopior, till replikering och total migrering till din lokala.


  1. Failover för PostgreSQL-replikering 101

  2. MySQL:ALTER IGNORE TABLE LÄGG TILL UNIK, vad kommer att trunkeras?

  3. Dela anslutning till postgres db över processer i Python

  4. Hur skapar man ett ja/nej booleskt fält i SQL-servern?