如何在ECS实例上搭建RDS备库

更新时间:

概述

本文主要介绍如何使用RDS MySQL 5.6/5.7的物理备份文件,在ECS实例上搭建备库。

详细信息

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

注意事项

  • 本文使用CentOS 7的操作系统以及MySQL 5.6版本为例进行演示。
  • 本地自建MySQL数据库的版本与RDS MySQL的版本需要一致。
  • 需要保证ECS实例能够正常访问RDS实例,且建议使用RDS内网地址进行搭建。
  • CentOS 6与CentOS 8操作系统版本结束了生命周期(EOL),按照社区规则,CentOS 6/8的源地址内容已移除。当您在CentOS 6/8系统内继续使用默认配置的源地址时会发生报错。建议您先切换CentOS 6/8的源地址,然后再进行操作。具体操作,请参见CentOS 6 EOL如何切换源?CentOS 8 EOL如何切换源?

安装MySQL数据库

  1. 登录ECS实例,执行以下命令,获取并安装MySQL源安装包。
    wget  https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm
    yum localinstall mysql80-community-release-el7-1.noarch.rpm
    说明:CentOS 6的操作系统需要下载并安装mysql80-community-release-el7-1.noarch.rpm源安装包。
  2. 依次执行以下命令,配置安装是5.6版本MySQL的Yum源。
    yum -y install yum-utils
    yum-config-manager --disable mysql80-community
    yum-config-manager --enable mysql56-community
    说明
    • 由于使用该Yum源默认安装的是8.0版本,因此需要执行以下命令,禁用默认安装8.0版本MySQL的Yum源。
      yum-config-manager --disable mysql80-community
    • 若您需要配置安装是5.7版本MySQL的Yum源,则执行以下命令。
      yum-config-manager --enable  mysql57-community
  3. 执行以下命令,安装MySQL Server。
    yum -y install mysql-community-server
  4. 编辑/etc/my.cnf文件,将文件内容替换成如下所示。
    说明:server-id不能与RDS实例相同。
    [mysqld]
    innodb_checksum_algorithm=crc32
    innodb_data_file_path=ibdata1:200M:autoextend
    innodb_log_files_in_group=2
    innodb_log_file_size=524288000
    innodb_undo_directory=/var/lib/mysql/
    basedir=/usr datadir=/var/lib/mysql
    innodb_undo_tablespaces=0
    server-id=55555
    log_bin=mysql-log
    gtid_mode=on
    enforce_gtid_consistency=on
    log-slave-updates=1
    relay_log=relay-log
    sql_mode=''
    binlog_format=row
    skip-grant-tables=1
  5. 依次执行以下命令,配置Yum源。
    yum -y install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
    yum update percona-release
  6. 依次执行以下命令,查看并选择需要安装的软件。
    yum list | grep percona
    yum -y install percona-xtrabackup.x86_64

将RDS物理备份文件迁移到自建的MySQL数据库

注意

  • 建议使用最新的物理备份文件,因为使用之前的物理备份文件,可能导致二进制日志已经被清理导致无法获取二进制日志,进而导致搭建RDS备库失败。
  • 2019年2月20日后创建的RDS MySQL 5.6实例,数据备份文件的格式为xbstream文件包,即以qp.xb为后缀文件。
  • 更多过于迁移物理备份文件的信息及操作,请参考RDS MySQL物理备份文件恢复到自建数据库
  1. 执行以下命令,下载RDS的备份文件并重命名为bak_qp.xb。
    wget -c '[$RDS_Backup]' -O bak_qp.xb
    说明
    • [$RDS_Backup]为物理备份文件的下载地址。
    • 若下载不成功,需要确认当前ECS的内网IP是否加入到RDS的白名单中。
    • 下载地址必须使用单引号引起来,否则会报403错误。
  2. 执行以下命令,进行解包。
    cat bak_qp.xb | xbstream -x -v -C [$DIR]
    说明:[$DIR]为自建数据库的数据目录绝对路径。
  3. 执行以下命令,进行解压。
    innobackupex --decompress --remove-original [$DIR]
  4. 执行以下命令,恢复解压好的备份文件。
    innobackupex --defaults-file=[$DIR]/backup-my.cnf --apply-log [$DIR]
  5. 执行以下命令,修改权限。
    chown -R mysql:mysql /var/lib/mysql
  6. 执行以下命令,启动MySQL。
    systemctl start mysql
  7. 执行mysql命令,进入MySQL命令行界面。
  8. 执行以下SQL语句,确认存在userroothost127.0.0.1的用户。
    说明:而MySQL 5.7版本需要确认存在aliyun_root账号。
    select user,host from mysql.user;
  9. 执行以下SQL语句,更新root账号的密码。
    UPDATE user SET password=PASSWORD("[$Password]") WHERE user='root' and host = '127.0.0.1';
    说明:[$Password]为您自定义的密码。
  10. 执行以下SQL语句,刷新权限。
    flush privileges;
  11. 退出数据库命令行界面,删除/etc/my.cnf配置文件中的skip-grant-tables=1​​​​​​参数。
  12. 执行以下命令,重启MySQL,然后确认可以使用RDS的账号登录。
    systemctl restart mysql

搭建备库

  1. 执行以下命令,使用root账号进入MySQL命令行界面。
    mysql -uroot -h127.0.0.1 -p[$Password]
  2. 依次执行以下SQL语句,删除5张表。
    use mysql; 
    drop table slave_master_info;
    drop table slave_relay_log_info;
    drop table slave_worker_info;
    drop table innodb_index_stats;
    drop table innodb_table_stats;
  3. 执行以下SQL语句,生成表数据。

    source /usr/share/mysql/mysql_system_tables.sql; 
  4. 然后退出数据库命令行界面,重新启动MySQL。
  5. 查看并记录/var/lib/mysql/xtrabackup_slave_info中的set global gtid_purged语句。
  6. 使用root账号进入MySQL命令行界面执行reset master;SQL语句,然后执行上一步记录的set global gtid_purgedSQL语句。
  7. 执行以下SQL语句,重置slave。
    reset slave;
  8. 执行以下SQL语句,配置主从复制。
    change master to master_host = '[$Host]', master_port = [$Port], master_user = '[$User]', master_password='[$Password]', master_auto_position = 1;
    说明
    • [$Host]为RDS实例的地址。
    • [$Port]为RDS实例的端口。
    • [$User]为RDS实例的账号。
    • [$Password]为RDS实例账号的密码。
  9. 依次执行以下SQL语句,确认Slave_IO_Running和Slave_SQL_Running值都为Yes。
    start slave;
    show slave status\G
    系统显示类似如下。

适用于

  • 云数据库RDS
  • 云服务器ECS