欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL复制从库建立-xtracebackup方式

程序员文章站 2022-05-09 11:08:00
Percona XtraBackup工具提供了一种在系统运行时执行MySQL数据热备份的方法。 Percona XtraBackup在事务系统上执行联机非阻塞,紧密压缩,高度安全的完整备份,因此在计划的维护时段内,应用程序仍保持完全可用。 环境准备: master:192.168.0.106:330 ......

percona xtrabackup工具提供了一种在系统运行时执行mysql数据热备份的方法。

percona xtrabackup在事务系统上执行联机非阻塞,紧密压缩,高度安全的完整备份,因此在计划的维护时段内,应用程序仍保持完全可用。

环境准备:

master:192.168.0.106:3306 
slave:192.168.0.105:3306

datadir: /data/mysql/mysql3306/data

cnfpath: /data/mysql/mysql3306/my3306.cnf

xtrabackup 安装,两台机器都安装:

下载地址:https://www.percona.com/downloads/percona-xtrabackup-latest/

themaster$ wget https://www.percona.com/downloads/percona-xtrabackup-latest/percona-xtrabackup-8.0-7/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.7-1.el7.x86_64.rpm
themaster$ yum install -y percona-xtrabackup-80-8.0.7-1.el7.x86_64.rpm

1、在master制作一个备份

themaster$ mkdir xtrabackup_backupfiles
themaster$ xtrabackup --defaults-file=/data/mysql/mysql3306/my3306.cnf -s /tmp/mysql3306.sock -uroot -p'' --backup --target-dir=./xtrabackup_backupfiles
...
completed ok!

为了让快照是一致的:需要prepare备份数据:

themaster$ xtrabackup -s /tmp/mysql3306.sock -uroot -p --prepare --target-dir=./xtrabackup_backupfiles/
...
completed ok!

undo log目录需要处理下,默认会解压到xtrabackup_backupfiles目录下,在my3306.cnf中定义在/data/mysql/mysql3306/data/undolog/下,所以:

themaster$ cd xtrabackup_backupfiles && mkdir undolog && mv undo_* undolog/

2、复制备份数据到slave上

使用rsync或scp将数据从master复制到slave。如果直接将数据同步到slave的数据目录,建议在这之前先停止mysqld。

themaster$ rsync -avpp -e ssh ./xtrabackup_backupfiles/ 192.168.0.105:/data/mysql/mysql3306/data/

复制数据前,您可以备份原始或先前安装的mysql datadir注意:在移动mysqld的内容或将快照移动到其datadir之前,请确保mysqld已关闭。):

theslave$ mv /data/mysql/mysql3306/data /data/mysql/mysql3306/data_bak

复制数据后,确保mysql有权限访问

theslave$ chown -r mysql:mysql /data/mysql/mysql3306/data

3、创建master上配置复制账号

themaster|mysql> grant replication slave on *.*  to 'repl'@'192.168.0.%' identified by 'repl';

测试连接

theslave$ mysql --host=192.168.0.106 --user=repl --password=repl
mysql> show grants;

4、配置slave上的mysql服务器

首先将my3306.cnf从themaster复制到theslave:

theslave$ scp root@192.168.0.106:/data/mysql/mysql3306/my3306.cnf /data/mysql/mysql3306/
theslave$ chown -r mysql:mysql /data/mysql/mysql3306/data/my3306.cnf

修改theslave上的my3306.cnf:

server-id=1053306  # 建议ip最后一位+端口号

启动theslave 上的 mysqld

theslave$ /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf &

观察error.log是否有错误

theslave$ more /data/mysql/mysql3306/data/error.log 

5、启动复制

theslave$ cat /data/mysql/mysql3306/data/xtrabackup_binlog_info
mysql-bin.000012        195     e8f74dde-ed8e-11e9-8ebb-000c29f5c092:1-3

执行change master语句在mysql命令行:

theslave|mysql> change master to
                master_host='192.168.0.106',
                master_user='repl',
                master_password='repl',
                master_auto_position=1;

开始复制:

theslave|mysql> start slave;

6、检查

theslave|mysql> show slave status \g
         ...
         slave_io_running: yes
         slave_sql_running: yes
         ...
         seconds_behind_master: 0
         ...

看到io和sql线程处于运行中 (yes)表示复制正常。

root@localhost 22:42:41 [(none)]> show slave status\g
error 2006 (hy000): mysql server has gone away
no connection. trying to reconnect...
connection id:    16
current database: *** none ***

*************************** 1. row ***************************
               slave_io_state: waiting for master to send event
                  master_host: 192.168.0.106
                  master_user: repl
                  master_port: 3306
                connect_retry: 60
              master_log_file: mysql-bin.000016
          read_master_log_pos: 383
               relay_log_file: localhost-relay-bin.000002
                relay_log_pos: 557
        relay_master_log_file: mysql-bin.000016
             slave_io_running: yes
            slave_sql_running: yes
              replicate_do_db: 
          replicate_ignore_db: 
           replicate_do_table: 
       replicate_ignore_table: 
      replicate_wild_do_table: 
  replicate_wild_ignore_table: 
                   last_errno: 0
                   last_error: 
                 skip_counter: 0
          exec_master_log_pos: 383
              relay_log_space: 769
              until_condition: none
               until_log_file: 
                until_log_pos: 0
           master_ssl_allowed: no
           master_ssl_ca_file: 
           master_ssl_ca_path: 
              master_ssl_cert: 
            master_ssl_cipher: 
               master_ssl_key: 
        seconds_behind_master: 0
master_ssl_verify_server_cert: no
                last_io_errno: 0
                last_io_error: 
               last_sql_errno: 0
               last_sql_error: 
  replicate_ignore_server_ids: 
             master_server_id: 1063306
                  master_uuid: e8f74dde-ed8e-11e9-8ebb-000c29f5c092
             master_info_file: mysql.slave_master_info
                    sql_delay: 0
          sql_remaining_delay: null
      slave_sql_running_state: slave has read all relay log; waiting for more updates
           master_retry_count: 86400
                  master_bind: 
      last_io_error_timestamp: 
     last_sql_error_timestamp: 
               master_ssl_crl: 
           master_ssl_crlpath: 
           retrieved_gtid_set: e8f74dde-ed8e-11e9-8ebb-000c29f5c092:4
            executed_gtid_set: e8f74dde-ed8e-11e9-8ebb-000c29f5c092:1-4
                auto_position: 1
         replicate_rewrite_db: 
                 channel_name: 
           master_tls_version: 
       master_public_key_path: 
        get_master_public_key: 0
            network_namespace: 
1 row in set (0.00 sec)