MySQL Replication 概述
MySQL Replication 俗称MySQL AB复制(主从,双机热备),从库以一定的频率去读取主库的二进制日志文件,按照日志中记录对从库进行同样的操作,以达到同步效果。
MySQL 支持的复制类型
基于语句的复制 在主服务器上执行的SQL语句,在从服务器上执行同样的语句,MySQL默认采用基于语句的复制,效率比较高基于行的复制 把改变的内容复制过去,而不是把命令在从服务器上执行一遍混合类型的复制 默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用行复制的工作过程
1.在每个事务更新完数据完成之前,Master在二进制日志(Binary log,binlog)记录这些改变,写入二进制日志完成后,Master通知存储引擎提交事务2.Slave将Master的Binary log复制到其中中继日志,首先Slave开始一个工作线程-I/O线程在Master上打开一个普通的连接,然后开始Binlog dump process,Binlog dump process从Master的二进制日志中读取事件,如果已经跟上Master,它会催眠并等待Master产生新的事件,I/O线程将这些事件写入中继日志。3.SQL Slave Thread(SQL从线程)处理该过程的最后一步,SQL线程从中继日志读取事件,并重放其中的事件而更新Slave的数据,使其与Master中的数据一致,只要该线程与I/O线程保持一致,中继日志通常会在OS的缓存中,所以中继日志的开销很小。
1:192.168.16.238 主master
192.168.16.239 从slave
[root@shell ~]# cat /etc/issue
Red Hat Enterprise Linux Server release 6.3 (Santiago)Kernel \r on an \m1)通过yum安装mysql
yum -y install mysql 安装客户端
yum -y install mysql-server 安装服务端
yum install mysql-devel
[root@oracle10g yum.repos.d]# rpm -qa |grep mysql
mysql-server-5.1.61-4.el6.x86_64mysql-libs-5.1.61-4.el6.x86_64mysql-devel-5.1.61-4.el6.x86_64mysql-5.1.61-4.el6.x86_64我们可以看到版本是5.1
service mysqld start
尝试登陆mysql数据库:
mysql数据库结构展示:
2)给mysql创建一个密码。
[root@oracle10g yum.repos.d]# mysqladmin -u root password 123456
3)service iptables stop
setenforce 0 关闭防火墙
4)建立时间同步,本次以master为主
yum -y install ntp
vi /etc/ntpd.conf
server 127.127.1.0
fudge 127.127.1.0 stratum 8 在最下面加入本段参数,说明:127.127.1.0 本地硬件时钟(由于时间服务器同步需要大概5分钟左右,如果在此期间执行ntpdate 61.129.42.44 会出现 8 Jun 20:57:14 ntpdate[22982]: no server suitable for synchronization found 的错误)
在slave服务端加入定时同步任务:1 1 * * * /usr/sbin/ntpdate 192.168.16.238 && /sbin/clock -systohc
5)配置master服务端
vi /etc/my.cnf
主机必须的配置项:
log-bin //自定义,比如 log-bin=mysql-bin server_id //为server起一个唯一的id,默认是1,推荐使用IP的最后一节。 从机必须的配置项: server_id //为server起一个唯一的id,默认是1,推荐使用IP的最后一节.注意:一般,我们也会为从机设定log-bin,这是因为默认的log-bin文件是根据主机名命名的,一旦机器更改主机名就会出问题,再者保持主从机的配制一致也方便做主从机切换!
主机可选的配置项:(用于配置主机哪些库会做二进制日志用以Replicate)
binlog-do-db binlog-ignore-db 从机可选的配置项:(用于配置从机会Replicate哪些库和表) replicate-do-db, replicate-ignore-db replicate-do-table, replicate-ignore-table replicate-wild-do-table replicate-wild-ignore-table
重启master服务端
service mysqld restart
创建Replication用户,并赋权(使得用户可以使用SHOW MASTER STATUS和SHOW SLAVE STATUS命令,也就是说这个权限是用于授予账户监视Replication状况的权力,)
update user set hosts='192.168.16.%' where user='myslave_zdsoft';
replication slave: 用于复制型从属服务器(从主服务器中读取二进制日志事件)
查看master状态
供Slave DB连接时使用,记录下File和Position的值
从库连接主库进行测试,如果连接成功说明主库配置成功
(update user set host='%' where host='localhost';
FLUSH PRIVILEGES; )
mysqldump -u root -h127-p123456 --all-databases > /root/alldbbackup.sql导出数据库
[root@shell ~]# mysql -u root -h 192.168.16.238 -p
Enter password: Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 9Server version: 5.1.61-log Source distributionCopyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
将库备份导入到从库当中
scp ~/*.sql 192.168.16.239:~
导入备份
mysql -u root -p < /root/*.sql
在主库创建一个test1的库
create database test1;
在 Slave服务器授权,启动从库,进行主从库数据同步
[root@shell ~]# mysql -u root -p123456
Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 2Server version: 5.1.61 Source distributionCopyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.16.238', -> MASTER_USER='myslave_zdsoft', -> MASTER_PASSWORD='654321', -> MASTER_LOG_FILE='mysql-binlog.000019', -> MASTER_LOG_POS=106;Query OK, 0 rows affected (0.30 sec)
参数说明:
mysql> CHANGE MASTER TO-> MASTER_HOST='master_host_name', //主服务器的IP地址-> MASTER_USER='replication_user_name', //同步数据库的用户-> MASTER_PASSWORD='replication_password', //同步数据库的密码-> MASTER_LOG_FILE='recorded_log_file_name', //主服务器二进制日志的文件名(前面要求记录的参数)-> MASTER_LOG_POS=recorded_log_position; //日志文件的开始位置(前面要求记录的参数)根据在主库执行的show master status 填写
start slave;
show slave status/G
如上图所示,库已经同步到从库.
create table a(name varchar(12),year varchar(12)); 在test1库里,创建表
参数说明:
log-bin = mysql-bin #复制过程即 Slave 从 Master 端获取该日志再执行日志记录的操作
server-id = 1 #1 代表 master 服务
binlog-do-db = backup#要同步的库 backup
binlog-ignore-db = mysql #不同步的库,初始所有库默认为不同步,但为了明确最好加上
server-id = 2 #2 代表 slave 服务
replicate-ignore-table = backup.tb2 #不同步 backup 库的 tb2 表skip-slave-start #防止复制随着 mysql 启动而自动启动。即 slave 端的 mysql 服务重启后需手动
来启动主从复制(slave start) ,最好加上,slave 端数据库服务重启后手动启动 slave 比较安全如果 slave 服务也同时作为另一个 mysql 服务的 master 服务,则配置文件[mysqld] 节点内容还需要加上 log-slave-updates
1:测试log-bin 后面的参数是否可以随便填 ( 此参数跟slave配置的 relay-log-bin参数原理一致)
1):log-bin=mysql-master
show master status
mysql> show master status;
+---------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+---------------------+----------+--------------+------------------+| mysql-master.000001 | 106 | | |+---------------------+----------+--------------+------------------+1 row in set (0.00 sec)我们可以看到file文件的名字变成了,mysql-master , log-bin参数为bin-log文件的名的前缀
2)测试 binlog-do-db参数,
binlog-do-db=test2
加到master中
分别在master库中创建test2 test3
create database test2;
create database test3;
mysql> show databases;
+--------------------+| Database |+--------------------+| information_schema || mysql || test || test1 || test2 |+--------------------+5 rows in set (0.00 sec)可以看到test2同步了,test3没有同步
3)replicate-ignore-table = test2.b 并加入skip-slave-start参数,使之不随mysql启动而启动
在slave服务器加入上述参数;
可以看到skip-slave-start参数已经生效。
replicate-ignore-table = test2.b 参数也生效了
总结:经过本次配置,主从复制简单来说就是slave通过配置的myslave_zdsoft(Replication)用户,读取master通过master配置的log-bin日志文件,通过分析,插入到从库中。