配置说明
MySQL的复制可以是整个数据库实例或者是某个库,某个表.主要通过master的binlog-do-db哪些要记录日志 -ignore-db哪些不用记录日志,slave可以通过replicate -do-db. -ignore-db...等复制命令进行同步进行控制.建议一般是通过slave端进行控制,可以更精细化的控制,master建立完整的日志操作。
一、安装MySQL
master:192.168.21.169
slave: 192.168.21.168
版本:MySQL 5.5.22
系统:linux
二、创建账户
创建用于Slave复制Master的账户1.创建slave账户方式一
#进入MySQL控制台>mysql -uroot -p #创建用户osyunweiuser,#建立MySQL主从数据库同步用户osyunweidbbak密码123456 >use mysql;>insert into user(Host,User,Password)values('localhost','osyunweiuser',password('123456')); #授权用户osyunweidbbak只能从192.168.21.%这个网段访问主服务器上面的数据库,并且只具有数据库备份的权限>grant replication slave on *.* to 'osyunweidbbak'@'192.168.21.%' identified by '123456';#刷新系统授权表>flush privileges;
2.创建slave账户方式二
#进入MySQL控制台>mysql -uroot -p #创建用户osyunweiuser>create user osyunweidbbak; #repl用户必须具有REPLICATION SLAVE权限,除此之外没有必要添加不必要的权限,密码为mysql。说明一下192.168.21.%,这个配置是指明repl用户所在服务器,这里%是通配符,表示192.168.21.1-192.168.21.255的Server都可以以repl用户登陆主服务器。当然你也可以指定固定Ip。>GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.21.%' IDENTIFIED BY 'mysql';
三.配置主从的my.cnf
主库:
[mysqld]server-id=169 #必须唯一log-bin=mysql-binbinlog_format=MIXED
从库:
[mysqld]server-id=168 #必须唯一log-bin=mysql-binrelay-log=relay-binrelay-log-index=relay-bin.indexreplicate-ignore-db=mysql #不对master的mysql库进行复制log_slave_updates=1 #将复制事件写进自己的二进制日志#replicate-do-db=mytestdbbinlog_format=MIXED
然后重启master库与slave库
四、将master数据备份到slave
注意:①如果是刚安装的数据库,可以不需要备份
注意:②该步骤同样适合用于主从不一致时的问题
1、进入数据库,锁定表,只能读取 【防止系统处于运行环境】#数据库只读锁定命令,防止导出数据库的时候有数据写入>flush tables with read lock;
2.退出数据库,进行数据库备份
>mysqldump --single-transaction --master-data=2 --triggers --routines --default-character-set='utf8' --flush-logs --all-databases -u root -p > master.sql;
注意:master-data=2 表示注释掉其中master.sql的日志点和日志CHANGE语句
3.进入数据库,解除锁定【防止系统处于运行环境】
#解除锁定>unlock tables;
4.拷贝备份SQL到从库
>scp master.sql root@192.168.21.168:`pwd` #传输到与master相同的目录下#或者执行如下命令#scp master.sql root@192.168.21.168:/tmp #传输到与master /tmp下
导入sql到slave数据库
>mysql -uroot -p < master.sql
五、连接master与slave
1.关闭master与slave的防火墙
checkconfig iptables off
2.找到日志点和日志文件
我们已经有了master.sql文件,只需要找到其中的change master一行
注意:网上的一些博客要说,使用如下命令,但是这条语句有个前提“在master备份时候或者是主从库都是刚安装数据库时候”才行,这个时候,数据库只能处于只读状态或者是空的,这样才能保证数据一致。
>show master status \G+------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000004 | 1687 | | mysql |+------------------+----------+--------------+------------------+
3.连接master与slave
#连接> CHANGE MASTER TOmaster_Host='192.168.21.169',master_Port=3306, master_User='osyunweiuser',master_Password='123456', master_Log_File='mysql-bin.000004',master_Log_Pos=1687,master_Connect_Retry=60;#启动slave> START SLAVE;
注意:如果之前本身已经是主从结构,那么可能需要执行如下命令
#停止slave> STOP SLAVE;#连接> CHANGE MASTER TOmaster_Host='192.168.21.169',master_Port=3306, master_User='osyunweiuser',master_Password='123456', master_Log_File='mysql-bin.000004',master_Log_Pos=1687,master_Connect_Retry=60;#重置并且启动slave>RESET SLAVE;>START SLAVE;
4.检查是否已经成功
>SHOW SLAVE STATUS\G #查看slave同步信息,出现以下内容*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.21.169 Master_User: osyunweidbbak Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.00004 Read_Master_Log_Pos: 1687 Relay_Log_File: MySQLSlave-relay-bin.000002 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000019 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: mysql Replicate_Do_Table: Replicate_Ignore_Table:
六、测试
master上
>create database foodsafe;>create table t1 (id int,name varchar(200),createtime timestamp,key(id));>insert into t1 values (1,'aa',now());>insert into t1 values (3,'bb',now());>select * from t1;
slave上:
use foodsafe;select * from t1;
观察两边结果是否一致。
参考博客