Loading

MySQL备份和还原

MySQL备份和还原

Percona XtraBackup

很多DBA以及阿里云的RDS都是基于Percona XtraBackup进行物理备份的. 但是此工具跟谁MySQL的版本更新也是分版本的.

  1. MySQL 5.6及之前的版本需要安装 Percona XtraBackup 2.3, 安装指导请参见官方文档Percona XtraBackup 2.3.
  2. MySQL 5.7版本需要安装 Percona XtraBackup 2.4,安装指导请参见官方文档Percona XtraBackup 2.4
  3. MySQL 8.0版本需要安装 Percona XtraBackup 8.0,安装指导请参见官方文档Percona XtraBackup 8.0

安装解压缩功能根据qpress

wget "http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/183466/cn_zh/1608011575185/qpress-11-linux-x64.tar"
tar xvf qpress-11-linux-x64.tar
chmod 775 qpress
cp qpress /usr/bin

目前物理备份集文件有3种格式:

  • tar 压缩包 (.tar.gz 后缀)
  • xbstream 压缩包 (.xb.gz 后缀)
  • xbstream 文件包(_qp.xb 后缀)

对于tar 压缩包 (.tar.gz 后缀),使用命令:

tar -izxvf <数据备份文件名> -C /home/mysql/data

对于xbstream 压缩包 (.xb.gz 后缀),使用命令:

gzip -d -c <数据备份文件名> | xbstream -x -v -C /home/mysql/data

对于xbstream 文件包(_qp.xb 后缀),使用命令:

## 解包
cat <数据备份文件名> | xbstream -x -v -C /home/mysql/data

## MySQL 5.6/5.7解压
innobackupex --decompress --remove-original /home/mysql/data
## MySQL 8.0解压
xtrabackup --decompress --remove-original --target-dir=/home/mysql/data

执行如下命令,恢复解压好的备份文件:

## MySQL 5.6/5.7
innobackupex --defaults-file=/home/mysql/data/backup-my.cnf --apply-log /home/mysql/data

## MySQL 8.0
xtrabackup --prepare --target-dir=/home/mysql/data
xtrabackup --datadir=/var/lib/mysql --copy-back --target-dir=/home/mysql/data

若系统返回如下报错,可以用rm -rf /var/lib/mysql命令清空文件夹内文件,然后用chown -R mysql:mysql /var/lib/mysql修改权限。

为避免版本问题,需修改backup-my.cnf参数,具体操作步骤如下。

  • 执行如下命令,以文本方式编辑backup-my.cnf文件
vi /home/mysql/data/backup-my.cnf
  • 添加如下参数:
lower_case_table_names=1
  • 注释掉如下自建数据库不支持的参数:
#innodb_log_checksum_algorithm
#innodb_fast_checksum
#innodb_log_block_size
#innodb_doublewrite_file
#innodb_encrypt_algorithm
#rds_encrypt_data
#redo_log_version
#master_key_id
#server_uuid

执行如下命令,修改文件属主,并确定文件所属为MySQL用户:

chown -R mysql:mysql /home/mysql/data

执行如下命令,启动MySQL进程:

mysqld --defaults-file=/home/mysql/data/backup-my.cnf --user=mysql --datadir=/home/mysql/data &

执行如下命令,登录MySQL数据库以验证进程启动成功:

mysql -u<源RDS实例账号> -p<对应密码>

MySQLdump备份和还原

  1. 在自建数据库中创建迁移账号,命令如下:
CREATE USER '<迁移账号名称>'@'%' IDENTIFIED BY '<迁移账号对应密码>';
CREATE USER 'migrate'@'%' IDENTIFIED BY 'Migrate123';
  1. 在自建数据库授权迁移账号SELECT和REPLICATION SLAVE权限,命令如下:
GRANT SELECT ON <数据库名>.<表名> TO '<迁移账号名称>'@'%' WITH GRANT OPTION;
GRANT REPLICATION SLAVE ON <数据库名>.<表名> TO '<迁移账号名称>'@'%' WITH GRANT OPTION;

如果为该账号所有的数据库或表授权,可以使用通配符*。
如果为该账号授权所有的权限,可以用ALL表示所有权限。

GRANT ALL ON *.* TO 'migrate'@'%' WITH GRANT OPTION;
  1. 使用mysqldump导出自建数据库的数据、存储过程、触发器和函数, 导出期间请勿进行数据更新.

i. 导出自建数据库的数据,命令如下:

mysqldump -h <自建数据库服务器IP地址> -u <迁移账号名称> -p --opt --default-character-set=utf8 --hex-blob <自建数据库名> --skip-triggers --skip-lock-tables > /tmp/<自建数据库名>.sql

mysqldump -h 127.0.0.1 -u migrate -p --opt --default-character-set=utf8 --hex-blob testdb --skip-triggers --skip-lock-tables > /tmp/testdb.sql

ii. 导出存储过程、触发器和函数,命令如下:

mysqldump -h <自建数据库服务器IP地址> -u <迁移账号名称> -p --opt --default-character-set=utf8 --hex-blob <自建数据库名> -R | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > /tmp/<自建数据库名>Trigger.sql

mysqldump -h 127.0.0.1 -u migrate -p --opt --default-character-set=utf8 --hex-blob testdb -R | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > /tmp/testdbTrigger.sql
  1. 将导出的文件导入到目标RDS中,命令如下:
mysql -h <RDS实例连接地址> -u <RDS实例账号> -p <RDS数据库名称> < /tmp/<自建数据库名>.sql
mysql -h <RDS实例连接地址> -u <RDS实例账号> -p <RDS数据库名称> < /tmp/<自建数据库名>Trigger.sql

mysql -h rm-bpxxxxx.mysql.rds.aliyuncs.com -u testuser -p testdb  < /tmp/testdb.sql
mysql -h rm-bpxxxxx.mysql.rds.aliyuncs.com -u testuser -p testdb  < /tmp/testdbTrigger.sql

PS:

Q:OPERATION need to be executed set by ADMIN报错怎么解决?

A:可能是SQL脚本里面包括视图,触发器,存储过程等对象的definer问题,或者含有set global类SQL导致。详情请参见RDS MySQL出现“OPERATION need to be executed set by ADMIN”报错。

Q:Access denied; you need (at least one of) the SUPER privilege(s) for this operation报错怎么解决?

SQL脚本里面包括SUPER权限的语句,将相关语句删除再执行。

posted @ 2020-12-22 16:02  Devops、小铁匠  阅读(308)  评论(1编辑  收藏  举报