Mysql主从同步其实是一个异步复制的过程,要实现复制首先需要在master上开启bin-log日志功能,整个过程需要开启3个线程,分别是Master开启IO线程,slave开启IO线程和SQL线程。
a) 在从服务器执行slave start,从服务器上IO线程会通过授权的用户连接上master,并请求master从指定的文件和位置之后发送bin-log日志内容。
b) Master服务器接收到来自slave服务器的IO线程的请求后,master服务器上的IO线程根据slave服务器发送的指定bin-log日志之后的内容,然后返回给slave端的IO线程。(返回的信息中除了bin-log日志内容外,还有本次返回日志内容后在master服务器端的新的binlog文件名以及在binlog中的下一个指定更新位置。)
c) Slave的IO线程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪 个位置开始往后的日志内容,请发给我”;
d) Slave的Sql线程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
mysql主从实战配置
环境搭建:
yum install -y mysql mysql-devel mysql-server mysql-libs
1, 第一步,
在A上面创建专门用于备份的 用户:
grant replication slave on *.* to 'user1'@'192.***.***.***' identified by 'hj34$%&mnkb';
这里的user1 和密码等会儿再slave端是需要的,
2. 开启主服务器的 binarylog。
一下是yum安装的一套标准配置文件:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=mysql-bin
server-id = 1
auto_increment_offset=1
auto_increment_increment=2
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
replicate-do-db =all
01 创建/data/mysql数据目录,mkdir –p /data/mysql ;chown –R mysqld:mysqld /data/mysql
02启动mysql即可,/etc/init.d/mysqld restart
3.修改slave Mysql数据库my.cnf配置文件内容如下:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
server-id = 2
auto_increment_offset=2
auto_increment_increment=2
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
先锁定master的discuz数据库:
mysql>flush tables with read lock;
导出数据库:
mysqldump -uroot -pxxx discuz >discuz.sql
在slave端创建数据库:
mysql>create database discuz;
导入数据库
mysql -uroot -pxxx discuz<discuz.sql
在Master数据库服务器上设置权限,执行如下命令:
grant replication slave on *.* to 'tongbu'@'%' identified by '123456';
在Master 数据库执行如下命令:
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000006 | 98 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
然后在slave服务器指定master IP和同步的pos点:
change master to
master_host='192.168.33.10',master_user='tongbu',master_password='123456',master_log_file='mysql-bin.000006',master_log_pos=98;
在slave启动slave start,并执行show slave status\G查看Mysql主从状态.
自此,主从同步,搭建完成.
mysql主从同步的原理:
1、在master上开启bin-log日志功能,记录更新、插入、删除的语句。
2、必须开启三个线程,主上开启io线程,从上开启io线程和sql线程。
3、从上io线程去连接master,master通过io线程检查有slave过来的请求,请求日志、postsion位置。
4、master将这些相应的日志返回给slave,slave自己去下载到本地的realy_log里面,写入一个master-info
日志记录同步的点。
5、slave的sql线程检查到realy-log日志有更新,然后在本地去exec执行。
6、主从同步是属于异步方式。
20133
insert into table values ('wgkgood','[email protected]');
20134
insert into t1 values ('Linux系统安装方法','dsfjsdklsdfjsdlk');
20135
change master to master_host='192.168.1.12',master_user='tongbu',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=272;
二、Mysql主从同步,master突然down机,如何恢复:
1、slave数据库必须启动,在slave上授权网站IP对数据库的访问权限。
2、修改网站服务器config目录下:
config_global.php config_ucenter.php 把原先master ip改成slave ip地址。
3、重启httpd服务,切换成功。
作业:
1、在master上已经创建好了discuz数据库,同时有论坛,新建从,怎么同步数据?
mysqldump >mysql.sql ;导入进去,再同步。
方法一:忽略错误后,继续同步
该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况
解决:
stop slave;
#表示跳过一步错误,后面的数字可变
set global sql_slave_skip_counter =1;
start slave;
之后再用mysql> show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
ok,现在主从同步状态正常了。。。
方式二:重新做主从,完全同步
该方法适用于主从库数据相差较大,或者要求数据完全统一的情况
解决步骤如下:
1)先进入主库,进行锁表,防止数据写入
使用命令:
mysql> flush tables with read lock;
注意:该处是锁定为只读状态,语句不区分大小写
2)进行数据备份
#把数据备份到mysql.bak.sql文件
[root@server01 mysql]#mysqldump -uroot -p -hlocalhost > mysql.sql
这里注意一点:数据库备份一定要定期进行,可以用shell脚本或者python脚本,都比较方便,确保数据万无一失
3)查看master 状态
mysql> show master status;
+-------------------+----------+--------------+-------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+-------------------------------+
| mysqld-bin.000001 | 272 | |
+-------------------+----------+--------------+-------------------------------+
1 row in set (0.00 sec)
4)把mysql备份文件传到从库机器,进行数据恢复
#使用scp命令
[root@server01mysql]# scp mysql.sql [email protected]:/tmp/
5)停止从库的状态
mysql> stop slave;
6)然后到从库执行mysql命令,导入数据备份
mysql> source /tmp/mysql.sql
7)设置从库同步,注意该处的同步点,就是主库show master status信息里的| File| Position两项
change master to master_host = '192.168.1.12', master_user = 'tongbu',master_password='123456', master_log_file = 'mysqld-bin.000001', master_log_pos=272;
8)重新开启从同步
mysql> start slave;
9)查看同步状态
mysql> show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
10)在master上解锁:
unlock tables;
数据库的使用:
每天进行增量备份,每周进行一次全部备份(企业中一般是一主一从,从上再跟两个从,主要是为了分担主数据库的读写压力,备份在第一台从上备份)
企业中有程序去控制 在哪一台数据库上写数据,哪一台数据库去读数据.
主主互备:
在slave端的my.cnf中 只需开启binarylog,server-id不变,还是2
然后在slave端给原来的master端授权
mysql> show master status;
mysql> change master to master_host = '192.168.1.12', master_user = 'tongbu',master_password='123456', master_log_file = 'mysqld-bin.000001', master_log_pos=272;
相当于是做了两个主从,用的是两个log-bin日志,互为主从