关于主从配置的好处和坏处我这里就不详细解说了,自己百度下就一大堆,我这就直入主题了
MySQL数据库复制操作大致可以分成三个步骤:
首先,主服务器会记录二进制日志,每个事务更新数据完成之前,主服务器将这些操作的信息记录在二进制日志里面在事件写入二进制日志完成后主服务器通知存储引擎提交事务。
准备: 了解binlog日志,MySQL用户-权限
mysql服务器配置复制不难,但是因为场景不同可能会存在一定的差异化,总的来说分为一下几步:
对于主从复制,在本质上就是通过与从数据库复制与主数据库的binlog日志文件,通过重做实现的同步; 但是一定要注意尽量保证主从服务器上安装了相同的版本的数据库,设定主从的服务器ip地址为192.168.153.129从服务器的ip地址是192.168.153.131。
然后再主服务器上设置一个复制使用的账号,并授予replication slave权限。我们可以根据ip创建账号为127
/*
创建账号sql:
create user 'username'@'localhost' identified by 'password';
授权
grant [权限] on *.* to 'username'@'localhost' identified by 'password';
*/
mysql> create user 'repl_131'@'%' identified by 'repl_131';
Query OK, 0 rows affected (0.04 sec)
mysql> select user,host from mysql.user;
mysql> grant replication slave on *.* to 'repl_131'@'%' identified by 'repl_131';
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 | /www/server/data/mysql-bin |
| log_bin_index | /www/server/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+----------------------------------+
5 rows in set (0.03 sec)
作用就是
解释为什么每次修改配置文件都用find...因为记不住
[root@localhost panel]# vi /etc/my.cnf
主要就是下配置文件中添加如下配置
[mysqld]
log-bin=mysql-bin
server-id=1
查看MySQL的日志文件, 这是查询主服务器上当前的二进制日志名和偏移值。这个操作的母的是为了在从数据库启动以后,从这个点进行数据库的恢复。
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000009 | 708 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
对于binlog来说mysql-bin.xxx就是binlog的节点日志文件,而mysql-bin.index这是日志文件的所以会记录的是所有日志文件的地址
[root@localhost data]# more mysql-bin.index
./mysql-bin.000006
./mysql-bin.000007
./mysql-bin.000008
./mysql-bin.000009
我们可以看看binlog日志中的信息
-- 查看二进制日志信息
Mysqlbinlog filename
show binlog events in 'filename'\G;
查看binlog的信息,先设置mysqlbinlog为系统环境变量
[root@localhost data]# vi ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/www/server/mysql/bin
export PATH
[root@localhost data]# source ~/.bash_profile
[root@localhost data]# cd /www/server/data
[root@localhost data]# mysqlbinlog ./mysql-bin.000009
日志中由 #at xxx 头, #at xxx ~~ /!/ 体两部分组成
-- 查看所有二进制文件信息
show binary logs;
-- 查看最新二进制文件
show master status;
-- 刷新日志
flush logs;
-- 清空所有的日志文件
reset master
添加一下测试的数据操作
CREATE DATABASE bin DEFAULT CHARACTER SET utf8;
use bin;
CREATE TABLE `t` (
`id` int(10) ,
`name` varchar(20)
) ;
INSERT INTO t VALUES(1, 'sixstar');
INSERT INTO t VALUES(2, 'shineyork');
INSERT INTO t VALUES(3, 'xxx');
这个时候我们可以看看这个binlog日志中的信息
mysql> show binlog events in 'mysql-bin.000001';
+------------------+------+----------------+-----------+-------------+-----------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+------+----------------+-----------+-------------+-----------------------------------------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.27-log, Binlog ver: 4 |
| mysql-bin.000001 | 123 | Previous_gtids | 1 | 154 | |
| mysql-bin.000001 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000001 | 219 | Query | 1 | 310 | create database bin |
| mysql-bin.000001 | 310 | Anonymous_Gtid | 1 | 375 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000001 | 375 | Query | 1 | 505 | use `bin`; CREATE TABLE `t` (
`id` int(10) ,
`name` varchar(20)
) |
| mysql-bin.000001 | 505 | Anonymous_Gtid | 1 | 570 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000001 | 570 | Query | 1 | 647 | BEGIN |
| mysql-bin.000001 | 647 | Query | 1 | 753 | use `bin`; INSERT INTO t VALUES(1, 'sixstar') |
| mysql-bin.000001 | 753 | Xid | 1 | 784 | COMMIT /* xid=2369 */ |
| mysql-bin.000001 | 784 | Anonymous_Gtid | 1 | 849 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000001 | 849 | Query | 1 | 926 | BEGIN |
| mysql-bin.000001 | 926 | Query | 1 | 1034 | use `bin`; INSERT INTO t VALUES(2, 'shineyork') |
| mysql-bin.000001 | 1034 | Xid | 1 | 1065 | COMMIT /* xid=2370 */ |
| mysql-bin.000001 | 1065 | Anonymous_Gtid | 1 | 1130 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000001 | 1130 | Query | 1 | 1207 | BEGIN |
| mysql-bin.000001 | 1207 | Query | 1 | 1309 | use `bin`; INSERT INTO t VALUES(3, 'xxx') |
| mysql-bin.000001 | 1309 | Xid | 1 | 1340 | COMMIT /* xid=2371 */ |
+------------------+------+----------------+-----------+-------------+-----------------------------------------------------------------------+
18 rows in set (0.00 sec)
接下来做一个操作就是对于t表中的数据进行删除所有的数据(这是模拟某些不小心的同学做的操作);
mysql> delete from `t` where id > 1;
Query OK, 2 rows affected (0.02 sec)
mysql> select * from t;
+------+---------+
| id | name |
+------+---------+
| 1 | sixstar |
+------+---------+
1 row in set (0.00 sec)
现在来做恢复;根据数据情况找到数据的节点位置, 发现是从849开始到1340结束
[root@localhost data]# mysqlbinlog mysql-bin.000001 --start-position 849 --stop-position 1340 | mysql -u root -p
Enter password:
注意:对于使用虚拟机的同学--注意克隆之后的系统你需要稍微修改一下系统的ip 地址
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.153.131
NETMASK=255.255.255.0
GATEWAY=192.168.153.2
[root@localhost ~]# systemctl restart network
注意还顺便也修改一下宝塔的nginx服务地址 -- 然后暂时就ok了把...
在进行配置之前,回顾一下过程
要先明确配置的架构Master-slave
1. 配置主节点 1.1 配置账号 1.2 开启binlog日志 2. 配置从节点 2.1 配置同步日志 2.2 指定主节点的ip, 端口, 用户.. 2.3 启动从节点
3.1 配置同步日志
修改配置
[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 = /www/server/data/mysql-relay-bin
relay_log-index = /www/server/data/mysql-relay-bin.index
log_slave_updates = 1
read_only = 1
参数介绍: server_id:这是服务id系统会自动命名的,但如果机器名边画画肯能回答导致问题。可以讲你主库和备库上的log-bin设置为相同的值。 relay_log:指定中继日志的位置和命名
3.2 指定主节点的ip,端口,用户
mysql> change master to master_host='192.168.153.129',master_port=3306,master_user='127',master_password='127',master_log_file='mysql-bin.000001',master_log_pos=0;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
3.3 启动从节点
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信息
测试的方法就是在主服务器中,添加一些数据测试观察从服务其中的数据变化情况。
进入slave服务器,运行:
mysql> show slave status\G
.......
Relay_Log_File: localhost-relay-bin.000535
Relay_Log_Pos: 21795072
Relay_Master_Log_File: localhost-bin.000094
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
......
解决办法一、
Slave_SQL_Running: No
1.程序可能在slave上进行了写操作
2.也可能是slave机器重起后,事务回滚造成的.
一般是事务回滚造成的:
解决办法:
mysql> stop slave ;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave ;
解决办法二、
首先停掉Slave服务:slave stop
到主服务器上查看主机状态:
记录File和Position对应的值
进入master
mysql> show master status;
+----------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+----------+--------------+------------------+
| localhost-bin.000094 | 33622483 | | |
+----------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
然后到slave服务器上执行手动同步:
mysql> change master to
> master_host='master_ip',
> master_user='user',
> master_password='pwd',
> master_port=3306,
> master_log_file=localhost-bin.000094',
> master_log_pos=33622483 ;
1 row in set (0.00 sec)
mysql> start slave ;
1 row in set (0.00 sec)
mysql> show slave status\G
*************************** 1. row ***************************
........
Master_Log_File: localhost-bin.000094
Read_Master_Log_Pos: 33768775
Relay_Log_File: localhost-relay-bin.000537
Relay_Log_Pos: 1094034
Relay_Master_Log_File: localhost-bin.000094
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
手动同步需要停止master的写操作!