Eu executo um backup dinâmico de um banco de dados MySQL de produção usando um instantâneo LVM e, em seguida, tento restaurar esse backup em uma máquina de desenvolvimento. No entanto, o dev
banco de dados mysql não inicia e reclama que[InnoDB] Upgrade is not supported after a crash or shutdown with innodb_fast_shutdown = 2. This redo log was created with MySQL 5.7.33, and it appears logically non empty. Please follow the instructions at http://dev.mysql.com/doc/refman/8.0/en/upgrading.html
On prod
e dev
, mysql> SELECT @@datadir;
dá /data/mysql
( /data
é um volume lvm).
Em prod
e dev
, mysql> SELECT @@innodb_fast_shutdown
dá 1
.
informações da versão do mysql:
prod$ mysql --version
mysql Ver 14.14 Distrib 5.7.33, for Linux (x86_64) using EditLine wrapper
dev$ mysql --version
mysql Ver 8.0.34-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))
Parece que dev
meu backup ativo é o resultado de uma falha. Talvez seja porque estou usando FLUSH TABLES WITH READ LOCK;
para obter um instantâneo consistente, mas isso não resulta em uma imagem datadir compatível com atualização.
Se eu substituir os comandos FLUSH TABLES WITH READ LOCK
/ UNLOCK TABLES
por comandos systemctl stop mysql
/ systemctl start mysql
, a dev
máquina não reclamará do estado de travamento. No entanto, não quero fazer isso porque não quero perder conexões de banco de dados existentes ou negar conexões de entrada durante o breve período em que estou criando meu instantâneo na máquina prod
. Como posso criar um instantâneo consistente que funcione para atualizações sem desligar o daemon mysql?
Detalhes essenciais sobre como criar e restaurar o backup:
Para sua informação prod
, está executando o Ubuntu 16.04 e dev
o Ubuntu 20.04.
Meu procedimento de backup é assim:
Bloqueie todas as tabelas:
prod mysql> FLUSH TABLES WITH READ LOCK;
Crie um instantâneo:
prod# lvcreate --extents 100%FREE --snapshot --name mysql-backup /dev/myvg/mylv
Desbloqueie todas as mesas:
prod mysql> UNLOCK TABLES;
Monte o snapshot e crie um arquivo tar dos dados:
prod# mount /dev/myvg/mysql-backup /mnt/bkup prod# tar -C /mnt/bkup -aczf ~/bkup.tar.gz mysql
Limpar
prod# umount /mnt/bkup prod# lvremove --yes /dev/myvg/mysql-backup
Mova o arquivo tar para a máquina de desenvolvimento. Descompacte os dados em
/data/mysql
.Inicie o daemon mysql:
dev# systemctl start mysql Job for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.
Examinar
/var/log/mysql/error.log
:2023-10-03T14:21:47.688509Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.34-0ubuntu0.20.04.1) starting as process 79121 2023-10-03T14:21:47.746245Z 1 [System] [MY-011012] [Server] Starting upgrade of data directory. 2023-10-03T14:21:47.747076Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2023-10-03T14:21:48.125425Z 1 [ERROR] [MY-012526] [InnoDB] Upgrade is not supported after a crash or shutdown with innodb_fast_shutdown = 2. This redo log was created with MySQL 5.7.33, and it appears logically non empty. Please follow the instructions at http://dev.mysql.com/doc/refman/8.0/en/upgrading.html 2023-10-03T14:21:48.125480Z 1 [ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error. 2023-10-03T14:21:48.404686Z 1 [ERROR] [MY-011013] [Server] Failed to initialize DD Storage Engine. 2023-10-03T14:21:48.405086Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed. 2023-10-03T14:21:48.406142Z 0 [ERROR] [MY-010119] [Server] Aborting 2023-10-03T14:21:48.407096Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.34-0ubuntu0.20.04.1) (Ubuntu).
O mysql 8.0 não atualizará os arquivos de dados a menos que você primeiro execute um desligamento limpo usando o mysql 5.7. Felizmente, você pode fazer isso da seguinte maneira na
prod
máquina:/mnt/bkup
conforme descrito na pergunta acima./mnt/bkup/mysql
)./mnt/bkup/mysql
e transfira-o para adev
máquina.Para descobrir quais argumentos fornecer ao processo mysql temporário, usei o comando e
prod# mysqld --print-defaults
depois ajustei os argumentos--socket
,--port
, , e para que não interferissem na instância primária que está executando os dados de produção.--datadir
--tmpdir
--log_error
mysqld
Aqui está o que eu descobri, que funciona para mim:
Depois disso posso prosseguir para o tar
/mnt/bkup/mysql
e transferi-lo para adev
máquina, onde se eu inicializar o daemon mysql, obtenho o seguinte:Sucesso!