• 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权限的语句,将相关语句删除再执行。

  • 相关阅读:
    Effective Java:Ch4_Class:Item14_在public类中应该使用访问方法而不是public域
    [置顶] 学习JDK源码:可进一步优化的代码
    [置顶] 学习JDK源码:编程习惯和设计模式
    如何开展软件架构之概念架构
    POJ 3667 & 1823 Hotel (线段树区间合并)
    CF 161D Distance in Tree【树DP】
    BroadcastReceiver基础总结
    OSI七层模型具体解释
    习惯的力量之四理直气壮的借口?
    堆(stack) 之 c 和 c++模板实现(空类默认成员函数 初谈引用 内联函数)
  • 原文地址:https://www.cnblogs.com/skymyyang/p/14173550.html
Copyright © 2020-2023  润新知