zoukankan      html  css  js  c++  java
  • 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权限的语句,将相关语句删除再执行。

  • 相关阅读:
    combotree的总结(这个好)
    Extjs下拉树代码测试总结
    ExtJs 3 自定义combotree
    项目中EXTjs中运用到的下拉树
    EXTJS下拉树ComboBoxTree参数提交及回显方法
    Extjs window组件 拖动统制
    extjs grid数据改变后刷新的实现
    获取 ext grid 选中行 对象
    ext:grid分页,列宽度自动填满grid宽度
    pringBoot2.0启用https协议
  • 原文地址:https://www.cnblogs.com/skymyyang/p/14173550.html
Copyright © 2011-2022 走看看