1. Mysql主从概念:

mysql的主从复制,是用来建立一个和主数据库完全一样的数据库环境,从库会同步主库得所有数据或 者指定数据,如果主库意外宕机,从库可轻松实现故障转移。

1.1 mysql主从主要作用:

实现数据备份;

基于数据备份,实现故障转移;

基于数据备份,实现读写分离;

1.2 常见mysql主从架构: 

Mysql主从搭建_mysql

1.3 MySQL主从部署:

master: 192.168.116.62
slave: 192.168.116.63
#关闭防火墙和selinux
systemctl stop firewalld ; systemctl disable firewalld
setenforce 0

1.3.1​ ​主从工作原理:

Mysql主从搭建_mysql_02

MySQL 主从复制中:
第一步:master 记录二进制日志。在每个事务更新数据完成之前,master 在二进制日志记录这些改变。MySQL 将事务写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master 通知存储引擎提交事务。
第二步:slavemasterbinary log 拷贝到它自己的中继日志。首先,slave 开始一个工作线程I/O线程。I/O 线程在master 上打开一个普通的连接,然后开始 binlog dump processBinlog dump processmaster 的二进制日志中读取事件,如果已经执行完 master 产生的所有文件,它会睡眠并等
master 产生新的事件。I/O 线程将这些事件写入中继日志。
第三步:SQL slave threadSQL 从线程)处理该过程的最后一步。SQL 线程从中继日志读取事件,并重新执行其中的事件而更新 slave 的数据,使其与master 中的数据一致。

1.3.2master端部署:

# 安装好mysql/mariadb数据库: 
yum instal mariadb mariadb-server -y
# 修改配置文件,在[mysqld]指令段添加以下行:
vim /etc/my.cnf
log-bin=mysql-bin-master #启用二进制日志
server-id=1 #ID必须是唯一的
# 启动数据库服务:
[root@localhost <sub>]# systemctl start mariadb
# 查看mysql进程:
[root@localhost </sub>]# ps -ef |grep mysqld
mysql 19497 1 0 15:24 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql 19685 19497 0 15:24 ? 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root 19722 19272 0 15:24 pts/0 00:00:00 grep --color=auto mysqld
# 查看mysql端口:
[root@localhost ~]# netstat -ntlp |grep 3306 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2203/mysqld

1.3.3​ 查看配置是否生效:

# 通过mysql直接进入数据库: 

[root@localhost ~]# mysql
MariaDB [(none)]> show master status;
+-------------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------------+----------+--------------+------------------+
| mysql-bin-master.000003 | 245 | | |
+-------------------------+----------+--------------+------------------+

ariaDB [(none)]> show variables like "%log_bin";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
| sql_log_bin | ON |
+---------------+-------+
MariaDB [(none)]> show master logs;
+-------------------------+-----------+
| Log_name | File_size |
+-------------------------+-----------+
| mysql-bin-master.000001 | 30340 |
| mysql-bin-master.000002 | 1038814 |
| mysql-bin-master.000003 | 245 |
+-------------------------+-----------+

1.3.4​ 授权从库:

MariaDB [(none)]> grant replication slave on *.* to "slave"@"192.168.116.63" identified by "123456";
Query OK, 0 rows affected (0.00 sec)
#授权谁来(slave)复制数据库给192.168.116.63.密码为123456.如果是授权一个网段格式:192.168.116.%
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
#设置root密码
MariaDB [(none)]> use mysql;
MariaDB [mysql]> update user set password=password("root")where user='root';
MariaDB [mysql]> flush privileges;

1.3.5​ 查看master状态:

MariaDB [(none)]> show master status;
+-------------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------------+----------+--------------+------------------+
| mysql-bin-master.000003 | 476 | | |
+-------------------------+----------+--------------+------------------+

1.3.6 slave端配置:

# 修改配置文件,在[mysqld]指令块下添加如下行: 
server-id=2
# 如果有需要指定同步某些数据库可以用以下参数:
replicate-do-db=wordpress
replicate-do-db=jfedu
# 如果有需要指定忽略某些数据库可以用以下参数: replicate-ignore-db=discuz
#设置root密码
MariaDB [(none)]> use mysql;
MariaDB [mysql]> update user set password=password("root")where user='root';
MariaDB [mysql]> flush privileges;

1.3.7​ 启动数据库服务:

[root@localhost ~]# systemctl start mariadb
#测试连接状态

Mysql主从搭建_sql_03

1.3.8 指定master:

MariaDB [(none)]> change master to master_host="192.168.116.62", master_user="slave",  master_password="123456",  master_log_file="mysql-bin-master.000003",  master_log_pos=476;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> slave start; #slave stop 停止
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> show slave status\G
*************************<strong> 1. row </strong>*************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.116.62
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin-master.000003
Read_Master_Log_Pos: 817
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 877
Relay_Master_Log_File: mysql-bin-master.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

1.3.10​ 验证数据同步:

# 在主库创建一个数据库: MariaDB [(none)]> create database jfedu charset=utf8; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> show databases;
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| jfedu |
| mysql |
| performance_schema |
| test |
+--------------------+
# 在从库查看: MariaDB [(none)]> show databases;
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| jfedu |
| mysql |
| performance_schema |
| test |
+--------------------+
MariaDB [(none)]> create database HA;
MariaDB [(none)]> use HA;
MariaDB [HA]> create table T1(id int,name varchar(20));
MariaDB [HA]> insert into T1 values(1,'hello');
#从库上查看
MariaDB [(none)]> select * from HA.T1;
+------+-------+
| id | name |
+------+-------+
| 1 | hello |
+------+-------+

1.3.11​ 同步错误分析

Slave_IO_Running: Connecting 
# 第一种:主库宕机
# 第二种:从库指定的用户名与密码错误(与主库授权的用户名和密码不一致)
# 第三种:关闭防火墙 Slave_IO_Running: No
# 从库指定的二进制文件或者pos点有误 Slave_SQL_Running: No
# pos点问题
#############################################################查看bin-log日志
mysqlbinlog /var/lib/mysql/mysql-bin-master.000001

2、主从复制延迟问题及解决方法:

1、 从库过多:
建议从库数量3-5 为宜,要复制的从节点数量过多,会导致复制延迟。
2 、从库硬件差:
从库硬件比主库差,导致复制延迟,查看masterslave的系统配置,可能会因为机器配置的问题,包
括磁盘IOCPU、内存等各方面因素造成复制的延迟,一般发生在高并发大数据量写入场景。
3 、网络问题:
主从库之间的网络延迟,主库的网卡、网线、连接的交换机等网络设备都可能成为复制的瓶颈,导致复
制延迟

3、Mysqldump备份

1、只备份表,不备份数据库本身:
# 备份zabbix数据库中的所有表与数据,但是不会自动生成创建zabbix数据库的语句:
mysqldump -uroot -p*<strong> zabbix > zabbix.sql
2、备份数据库与表:
备份zabbix数据库中的所有表,并且会生成创建zabbix数据库的SQL语句,也就是导入时不需要先创建数据 库:
mysqldump -uroot -p</strong>* --databases zabbix > zabbix.sql
或者:
mysqldump -uroot -p*<strong> -B zabbix > zabbix.sql
3、备份多个数据库:
mysqldump -uroot -p</strong>* --databases zabbix mysql > zabbix_mysql.sql
4、备份所有数据库:
mysqldump -uroot -p*<strong> --all-databases > all.sql
或者:
mysqldump -uroot -p</strong>* -A > all.sql
5、 备份zabbix数据库,并且记录pos点:
mysqldump -uroot -p --master-data zabbix > zabbix.sql
6、 备份数据库,并刷新日志:
mysqldump -uroot -p --master-data --flush-logs zabbix > zabbix.sql