mysql主从复制

热备份与恢复

xtrabackup手册:https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html

热备份的方式也是直接复制数据物理文件,和冷备份一样,但热备份可以不停机直接复制,一般用于7×24小时不间断的重要核心业务。MySQL社区版的热备份 工具ImnoDB Hot Backup是付费的,只能试用30天,只有购买企业版才可以得到永久使用权。Percona公司发布了一个xtrabackup热备份工具,和官方付费版的 功能一样,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDBHot Backup的一个很好的替代品。下面具体介绍一下这个软件的使用方法。 xtrabackup是Percona公司的开源项目,用以实现类似ImnoDB官方的热备份工具ImmoDB Hot Backup的功能,它能非常快速地备份与恢复MySQL数据库。

下面来看看xtrabackup的安装方法,安装命令如下:

[root@localhost file]$ yum localinstall percona-xtrabackup-80-8.0.14-1.el7.x86_64.rpm
[root@localhost file]# xtrabackup
中主要包含两个工具:
xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
常用选项:
--host 指定主机
--user 指定用户名
--password 指定密码
--port 指定端口
--databases 指定数据库
--incremental 创建增量备份
--incremental-basedir 指定包含完全备份的目录
--incremental-dir 指定包含增量备份的目录
--apply-log 对备份进行预处理操作 一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。 因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
--redo-only 不回滚未提交事务
--copy-back 恢复备份目录

开始进行备份操作,进入 主库 中

[root@centos ~]# xtrabackup --defaults-file=/etc/my.cnf --user=root --password=root --port=3306 --backup --target-dir=/home/master_slave
[root@localhost home]# ll /home/laravel-shop/2019-09-26_12-43-34/
总用量 75832
-rw-r----- 1 root root 425 9月 26 12:43 backup-my.cnf
drwxr-x--- 2 root root 58 9月 26 12:43 bin
-rw-r----- 1 root root 361 9月 26 12:43 ib_buffer_pool
-rw-r----- 1 root root 77594624 9月 26 12:43 ibdata1
drwxr-x--- 2 root root 4096 9月 26 12:43 laravel@002dshop
drwxr-x--- 2 root root 4096 9月 26 12:43 mysql
drwxr-x--- 2 root root 8192 9月 26 12:43 performance_schema
drwxr-x--- 2 root root 8192 9月 26 12:43 sys
drwxr-x--- 2 root root 46 9月 26 12:43 test
-rw-r----- 1 root root 24 9月 26 12:43 xtrabackup_binlog_info
-rw-r----- 1 root root 113 9月 26 12:43 xtrabackup_checkpoints
-rw-r----- 1 root root 508 9月 26 12:43 xtrabackup_info
-rw-r----- 1 root root 2560 9月 26 12:43 xtrabackup_logfile

[root@localhost home]# scp -r /home/laravel-shop/ root@192.168.153.127:/home/laravel-shop

然后呢进入 从库中

[root@localhost server]# ll /home/laravel-shop/2019-09-26_12-43-34/
总用量 75832
-rw-r----- 1 root root 425 9月 27 21:54 backup-my.cnf
drwxr-x--- 2 root root 58 9月 27 21:54 bin
-rw-r----- 1 root root 361 9月 27 21:54 ib_buffer_pool
-rw-r----- 1 root root 77594624 9月 27 21:54 ibdata1
drwxr-x--- 2 root root 4096 9月 27 21:54 laravel@002dshop
drwxr-x--- 2 root root 4096 9月 27 21:54 mysql
drwxr-x--- 2 root root 8192 9月 27 21:54 performance_schema
drwxr-x--- 2 root root 8192 9月 27 21:54 sys
drwxr-x--- 2 root root 46 9月 27 21:54 test
-rw-r----- 1 root root 24 9月 27 21:54 xtrabackup_binlog_info
-rw-r----- 1 root root 113 9月 27 21:54 xtrabackup_checkpoints
-rw-r----- 1 root root 508 9月 27 21:54 xtrabackup_info
-rw-r----- 1 root root 2560 9月 27 21:54 xtrabackup_logfile
[root@localhost server]#
[root@localhost server]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS!
[root@localhost server]# mv /www/server/data /www/server/data2
[root@localhost server]# xtrabackup --defaults-file=/etc/my.cnf --copy-back --target-dir=/home/mysql_php/mysql_php
[root@localhost server]# chown -R mysql:mysql /usr/local/mysql/data
[root@localhost server]# /etc/init.d/mysqld start Starting MySQL.Logging to '/www/server/data/localhost.localdomain.err'. . SUCCESS!
[root@localhost server]# mysql -u root -p
mysql> show databases;
+--------------------+
|     Database       |
+--------------------+
| information_schema |
| bin                |
| laravel-shop       |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
7 rows in set (0.02 sec

对于热备份实现解释

1. innobackupex启动后,会先fork一个进程,用于启动xtrabackup,然后等待xtrabackup备份ibd数据文件;
2. xtrabackup在备份innoDB数据是,有2种线程:redo拷贝线程和ibd数据拷贝线程。xtrabackup进程开始执行后,会启动一个redo拷贝的线程,用于从最新的 checkpoint点开始顺序拷贝redo.log;再启动ibd数据拷贝线程,进行拷贝ibd数据。这里是先启动redo拷贝线程的。在此阶段,innobackupex进行处于等待 状态(等待文件被创建)
3. xtrabackup拷贝完成ibd数据文件后,会通知innobackupex(通过创建文件),同时xtrabackup进入等待状态(redo线程依旧在拷贝redo.log)
4. innobackupex收到xtrabackup通知后哦,执行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB文件(如frm、 MYD、MYI、CSV、opt、par等格式的文件),在拷贝非InnoDB文件的过程当中,数据库处于全局只读状态。
5. 当innobackup拷贝完所有的非InnoDB文件后,会通知xtrabackup,通知完成后,进入等待状态;
6. xtrabackup收到innobackupex备份完成的通知后,会停止redo拷贝线程,然后通知innobackupex,redo.log文件拷贝完成;
7. innobackupex收到redo.log备份完成后,就进行解锁操作,执行:UNLOCK TABLES;
8. 最后innbackupex和xtrabackup进程各自释放资源,写备份元数据信息等,innobackupex等xtrabackup子进程结束后退出。

主从复制实现方式

/*创建账号sql:
create user 'username'@'localhost' identified by 'password';

授权grant [权限] on *.* to 'username'@'localhost' identified by 'password';

*/ mysql> CREATE USER 'slave'@'192.168.81.%' IDENTIFIED WITH mysql_native_password BY 'slave';
Query OK, 0 rows affected (0.04 sec)

mysql> select user,host from mysql.user;

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.81.%';
Query OK, 0 rows affected, 1 warning (0.00 sec)

对于MySQL的主从复制来说最重要的主要就是binlog日志,所以我们就需要开启binlog日志,并设置server-id的值。需要重启服务器之后才生效 二进制日志,也就是我们常说的binlog。

二进制日志记录了MySQL所有修改数据库的操作,然后以二进制的形式记录日志在日志文件中,其中还包括没调语句所 执行的时间和消耗的资源,以及相关的事务信息。默认情况下二进制日志功能是没有开启的,启动可以配置log-bin[=file_name]开启,

mysql> show global variables like '%log_bin%';
+---------------------------------+---------------------------------------+
| Variable_name                   | Value                                 |
+---------------------------------+---------------------------------------+
| log_bin                         | ON                                    |
| log_bin_basename                | /usr/local/mysql/data/mysql-bin       |
| log_bin_index                   | /usr/local/mysql/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF                                   |
| log_bin_use_v1_row_events       | OFF                                   |
+---------------------------------+---------------------------------------+
5 rows in set (0.03 sec)

作用就是

  1. 增量备份(不是所有数据备份,而是最近的写操作)
  2. 用于MySQL主从复制
[root@localhost panel]# vi /etc/my.cnf

主要就是下配置文件中添加如下配置

[mysqld]
log-bin=mysql-bin
server-id=1

4.1.2 Slave节点配置

注意:对于使用虚拟机的同学--注意克隆之后的系统你需要稍微修改一下系统的ip 地址

[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.29.105
NETMASK=255.255.255.0
GATEWAY=192.168.29.2
[root@localhost ~]# systemctl restart network

在进行配置之前,回顾一下过程

要先明确配置的架构Master-slave

  1. 配置主节点 1.1 配置账号 1.2 开启binlog日志
  2. 配置从节点 2.1 配置同步日志 2.2 指定主节点的ip, 端口, 用户.. 2.3 启动从节点

修改配置

[root@localhost ~]# find / -name my.cnf /etc/my.cnf
[root@localhost ~]# vi /etc/my.cnf
[root@localhost ~]# find / -name mysqld /etc/rc.d/init.d/mysqld /www/server/mysql/bin/mysqld
[root@localhost ~]# /etc/rc.d/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!

在配置文件中添加

# 配置从节点
server-id = 2
relay_log = /usr/local/mysql/data/mysql-relay-bin
relay_log-index = /usr/local/mysql/data/mysql-relay-bin.index
log_slave_updates = 1
read_only = 1

参数介绍:

  1. server_id:这是服务id系统会自动命名的,但如果机器名边画画肯能回答导致问题。可以讲你主库和备库上的log-bin设置为相同的值。
  2. relay_log:指定 中继日志的位置和命名

指定主节点的ip,端口,用户

mysql> change master to
master_host='192.168.29.102',master_port=3306,master_user='slave',master_password='slave',master_log_file='mysqlbin.000002',master_log_pos=155;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

启动从节点

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status \G;

对于我们来说其中的信息主要是关注

Slave_IO_Running: Connecting
Slave_SQL_Running: Yes

reset slave all 清楚slave信息 测试的方法就是在主服务器中,添加一些数据测试观察从服务其中的数据变化情况。

使用的是冷备份文件恢复的实例

mysql> reset slave;
Query OK, 0 rows affected (0.01 sec)

mysql> change master to ......

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
————————————————
版权声明:本文为CSDN博主「无知的蜗牛」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_37998647/article/details/79950133

上一篇:阿里云|腾讯云MySQL备份文件一键恢复工具


下一篇:xtrabackup基本使用