mysql主从数据库复制
原创文章,请尊重作者辛勤劳动。
运行环境:
l 虚拟机模仿四台CentOS6.3服务器
l 主数据库master1 :192.168.88.21
l 从数据库slave1 :192.168.88.22
l 从数据库slave2 :192.168.88.23
l 从数据库slave3 :192.168.88.24
l Mysql5.5.28
具体实现方法:
- 在之前的文档,我们已经实现了CentOS服务器安装mysql数据库,接下来我们要实现的是数据库的主从复制,也就是将我们流程2 的示意图实现;
- 简单来说,实现复制分为3个步骤:
- 配置一台服务器作为主数据库Master
- 配置三台服务器作为从数据库Slave
- 将Slave连接到Master
- 配置Master:要确保该服务器有一个活动的二进制日志和唯一的服务器ID。我们后面再仔细研究二进制日志,现在只要知道二进制日志保存了Master上的所有改变,并且可以在Slave上重新执行即可。服务器ID用来区分服务器。要创建二进制日志和服务器ID,需要停掉服务器,然后将log-bin,log-bin-index和server-id选项添加到my.cnf配置文件。
[root@master1 ~]# vi /etc/my.cnf 添加红框内数据
注:server-id = 1 是mysql数据库默认存在的服务器ID配置,单个服务器不要重复配置。没给服务器都有一个唯一的服务器ID,如果一个Slave连接了Master,并且其server-id的参数值与Master相同,则会产生Master和Slave服务器ID相同的错误。
注:配置文件中存在service-id和log-bin的原配置参数,一定要注释或删除它。
log-bin:选项给出了二进制日志产生的所有文件的基本名。如果你创建了一个以log-bin为扩展名的文件名,该扩展名将被忽略,而只使用文件的基本名。
注:严格的说,不需要为log-bin选项提供值,其默认值是hostname-bin。Hostname的值来自pid-file选项,默认值是主机名(可以通过gethostname(2)系统调用得到)。如果管理员后来修改了主机名,binlog文件名也会随之改变,但是索引文件仍可以获取正确的值。最好为服务器创建一个机器无关的唯一的服务器名,因为一系列binlog文件中途改名可能会很混乱。
log-bin-index:选项给出了二进制索引文件的文件名,这个索引文件保存了所有binlog文件的列表。
注:如果没有为log-bin-index赋予任何值,其默认值与binlog文件的基本名相同(如果没有为log-bin提供值,其默认值为hostname-bin)。也就是说,如果你不赋值给log-bin-index,索引文件名会随主机名的改变而改变。所以,如果你改变主机名然后重启服务器,将找不到索引文件,从而认为索引文件不存在,导致二进制日志为空。
binlog-do-db:为需要复制数据库,如果存在多个只需要依次每行填写即可。
4. 修改Master的配置文件以后,重启Master
[root@master1 ~]# service mysqld restart
5. Slave启动一个标准的客户端连接到Master,并请求Master将所有的改动转存储给它。Slave连接时要求Master上有一个特殊复制权限的用户。
#Master服务器:进入mysql数据库
[root@master1 ~]# /usr/local/mysql/bin/mysql -u root -p123456
#Master服务器:创建一个复制用户并赋予复制权限,用户名为”replication”,运行从”192.168.88.*”IP来源数据,方便以后配置其他Slave服务器。
mysql> GRANT REPLICATION SLAVE,FILE ON *.* TO 'replication'@'192.168.88.%' IDENTIFIED BY '123456';
注:设置权限账号时不要将密码设置过于简单
6. 查看主数据库验证是否授权成功
#主服务器
mysql> select user,host,password from mysql.user;
7. 锁主库表
mysql> flush tables with read lock;
8. 显示主库信息。记录file和position信息,从库同步的时候用的到
mysql> show master status;
mysql> quit;
9. 主库用mysqldump备份zf_db整个库
[root@master1 ~]# /usr/local/mysql/bin/mysqldump -u root -p123456 zf_db > 20121218.sql
10. 从库从主库拷贝备份文件,存放到/root文件夹下(自己定义),第一次需要选择yes和输入主库密码
[root@slave2 ~]# rsync -acvz 192.168.88.21:20121218.sql /root
11. 登录从库,建立zf_db数据库
[root@slave2 ~]# /usr/local/mysql/bin/mysql -u root -p123456
mysql> create database zf_db;
mysql> quit;
12. 将20121218.sql文件导入到zf_db库,后面/root为从数据库拷贝过来sql文件位置
[root@slave2 ~]# /usr/local/mysql/bin/mysql -u root -p123456 zf_db < /root/20121218.sql
13. 解锁主库表
#主数据库
[root@master1 ~]# /usr/local/mysql/bin/mysql -u root -p123456
mysql> unlock tables;
14. 配置Slave:与Master一样,需要为每个Slave分配一个唯一的服务器ID。考虑使用relay-log和relay-log-index选项向my.cnf文件添加中继日志文件(relay log file)的文件名。
#编辑其他3台slave服务器的my.cnf,
[root@slave1 ~]# vi /etc/my.cnf
注:与log-bin和log-bin-index选项一样,relay-log和relay-log-index选项的默认值取决于hostname。Relay-log默认值是hostname-relay-bin,relay-log-index的默认值是hostname-relay-bin.index。使用默认值有个问题,即一旦服务器的主机名改变,会因为无法找到中继日志索引文件而认为中继日志文件为空。
15. 配置完成后,重启slave2从服务器
[root@slave2 ~]# service mysqld restart
16. 登录从库并且设置同步
[root@slave2 ~]# /usr/local/mysql/bin/mysql -u root -p123456
必须先停止从库的复制操作
mysql> stop slave;
赋予复制权限,数值为主库显示数值,参看第八步
注:MASTER_HOST为主服务器的IP地址,MASTER_USER和MASTER_PASSWORD为我们之前在主服务器创建的用户和密码,MASTER_LOG_FILE和MASTER_LOG_POS为我们之前在主服务器查看”db.sql”文件的信息。
mysql> change master to master_host='192.168.88.21',master_user='replication',master_password='123456',master_log_file='master1-bin.000003', master_log_pos=107;
mysql> start slave;
17. 查看从数据库复制状态,均为Yes说明配置成功!
mysql> show slave status\G;
18. 复制测试
#在主库增加一条数据,在从库查看是否复制
mysql> use zf_db;
mysql> insert into text_tb values ('congratulation');
mysql> select * from text_tb;
#从库查看数据是否复制
mysql> use zf_db;
mysql> select * from text_tb;
O YES 配置成功!