使用xtrabackup在线重建大数据量的从库

近期项目上需要重建两个从库,因为主库无法停库且数据量有800G之多,而且主库本身在华为云上有创建备份策略,使用的是xtrabackup工具实现的全备,故我们在重建从库时也直接以此为基础即可

1、确认主库的版本号,在从库所在服务器上安装好对应的mysql以及xtrabackup软件。

  • 我的主库是5.7版本,从库采用yum的方式安装的也是5.7版本的mysql,具体安装可以参考使用yum安装MySQL5.7,最主要的是要下载对应版本的Yum Repository:

    wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
    yum -y install mysql57-community-release-el7-10.noarch.rpm
    yum -y install mysql-community-server
    
  • 安装对应版本的xtrabackup软件
    因为是使用华为云的数据库备份文件为基础,有要求是XtraBackup 2.4.9版本即以上,我选择的安装最新版本,具体的可以去Percona Xtrabackup官方下载页面根据提示操作下载并安装。

    [NOTE]
    mysql 8.0对应的是Xtrabackup 8.0系列,mysql 5.7对应的是Xtrabackup 2.4系列,我都是使用yum的方式进行的安装。

  • 安装qpress程序
    因数据库较大,在备份的时候有进行压缩,qpress程序用于配合xtrabackup软件进行解压,在qpress软件包下载页面上可以通过下载tar包的方式进行安装,因上一步操作时有下载了xtrabackup的yum Repository,所以此部我依旧是使用yum的方式进行安装:

    yum install -y qpress

2、将备份文件下载并上传至从库服务器

  • 此步操作较为简单,但是也是比较耗时的一部,主要还是受带宽的影响。

3、解压文件

  • 创建一个临时目录用于存储解压文件
    mkdir /backupdir

  • 进行解压
    xbstream -x -p 4 < 全备文件.qp -C /backupdir/
    innobackupex --parallel 4 --decompress /backupdir

  • 删除多余的“.qp”备份文件
    find /backupdir/ -name '*.qp' | xargs rm -f

4、应用日志

  • xtrabackup备份的数据库在还原时需要先应用下备份当时的日志
    innobackupex --apply-log /backupdir

5、拷贝全备文件,并修改目录权限。

  • 先将目前的数据库关闭
    systemctl stop mysqld

  • 将原有的data目录做备份并移除
    mv /var/lib/mysql /var/lib/mysql_bak

  • 创建新的数据库目录并修改目录权限
    mkdir -p /var/lib/mysql
    chown -R mysql:mysql /var/lib/mysql

  • 根据需求配置好my.cnf文件
    还原从库时主要是datadir参数,当然其他参数也可以一并配置好,这边提供一个大致的配置作为参考:

    # For advice on how to change settings please see
    # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
    [client]
    port=3306
    socket = /var/lib/mysql/mysql.sock
    
    [mysqld]
    ############################## Basic configuration ###############################
    #
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    pid-file=/var/run/mysqld/mysqld.pid
    
    # lower_case_table_names = 1
    # sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    
    ################################## Connection ####################################
    #
    skip_name_resolve = 1
    max_connections = 5000
    max_connect_errors = 2000
    interactive_timeout = 1800
    wait_timeout = 1800
    
    ############################## Session Buffer Cache ###############################
    #
    # Remove leading # to set options mainly useful for reporting servers.
    # The server defaults are faster for transactions and fast SELECTs.
    # Adjust sizes as needed, experiment to find the optimal values.
    # join_buffer_size = 128M
    # sort_buffer_size = 2M
    # read_rnd_buffer_size = 2M
    # tmp_table_size = 
    max_allowed_packet = 128M
    
    ##################################### Logfile #####################################
    #
    log-error=/var/log/mysqld.log
    log_timestamps=SYSTEM
    slow_query_log = 1
    slow_query_log_file = /var/log/mysqld-slow.log
    log_queries_not_using_indexes = 1
    log_throttle_queries_not_using_indexes = 10
    log_slow_admin_statements = 1
    log_slow_slave_statements = 1
    long_query_time = 2
    min_examined_row_limit = 100
    
    ###################################### Binlog #####################################
    #
    # Remove leading # to turn on a very important data integrity option: logging
    # changes to the binary log between backups.
    #
    log_bin = mysql-bin
    binlog_format = row
    expire_logs_days = 7
    sync_binlog = 1000
    innodb_flush_log_at_trx_commit = 2
    binlog_rows_query_log_events = 1
    log-bin-trust-function-creators = 1
    
    ###################################### InnoDB #####################################
    #
    # Remove leading # and set to the amount of RAM for the most important data
    # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
    #
    innodb_buffer_pool_size = 40G
    innodb_flush_method = O_DIRECT
    
    #################################### Replication ##################################
    #
    server-id = 111
    skip_slave_start=1
    log-slave-updates = 1
    relay_log = relaylogs
    relay_log_recovery = 1
    relay_log_info_repository = TABLE
    master_info_repository = TABLE
    log_bin_trust_function_creators=true
    gtid_mode = on
    enforce_gtid_consistency = 1
    slave_skip_errors = 1062,1053,1007,1008,1050,1051,1054,1060,1061,1068,1091,1146
    # replicate-ignore-table =
    
    [mysqld_safe]
    log-error=/var/log/mysqld.log
    pid-file=/var/run/mysqld/mysqld.pid
    
  • 拷贝全备文件
    innobackupex --defaults-file=/etc/my.cnf --copy-back /backupdir
    完成后确认下目录的权限

6、启动还原后的数据库

  • systemctl方式启动
    systemctl start mysqld

7、确认主库复制的日志点

  • 在新的数据库目录下有xtrabackup_binlog_pos_innodb文件,查看其中记录的复制日志信息

8、重建从库链接

  • 使用change master to 语句重建从库链接,其中master_log_file和master_log_pos是上一步所确认的信息。

9、确认从库状态

  • show slave status\G
posted @ 2021-05-12 15:07  灬夜露沁心灬  阅读(273)  评论(0编辑  收藏  举报