mysql主从数据库复制

来源:互联网 发布:景安备案域名 编辑:程序博客网 时间:2024/05/16 17:47

运行环境:

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

具体实现方法:

  1. 在之前的文档,我们已经实现了CentOS服务器安装mysql数据库,接下来我们要实现的是数据库的主从复制,也就是将我们流程2 的示意图实现;
  2. 简单来说,实现复制分为3个步骤:
    1. 配置一台服务器作为主数据库Master
    2. 配置三台服务器作为从数据库Slave
    3. 将Slave连接到Master
  3. 配置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 -pdsideal4r5t6y7u

#Master服务器:创建一个复制用户并赋予复制权限,用户名为”replication”,运行从”192.168.88.*”IP来源数据,方便以后配置其他Slave服务器。

mysql> GRANT REPLICATION SLAVE,FILE ON *.* TO 'replication'@'192.168.88.%' IDENTIFIED BY 'dsideal4r5t6y7u';

注:设置权限账号时不要将密码设置过于简单

  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 -pdsideal4r5t6y7u 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 -pdsideal4r5t6y7u

mysql> create database zf_db;

mysql> quit;

  12. 将20121218.sql文件导入到zf_db库,后面/root为从数据库拷贝过来sql文件位置

[root@slave2 ~]# /usr/local/mysql/bin/mysql -u root -pdsideal4r5t6y7u zf_db < /root/20121218.sql

  13. 解锁主库表

#主数据库

[root@master1 ~]# /usr/local/mysql/bin/mysql -u root -pdsideal4r5t6y7u

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 -pdsideal4r5t6y7u

必须先停止从库的复制操作

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='dsideal4r5t6y7u',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   配置成功!

原创粉丝点击