MySQL 设定写入 Master 后, 自动 Replication 到 Slave 去, 运作基本原理是:
- INSERT/UPDATE/DELETE 语法, 自动写入 Master 的 binlog file.
- 由 GRANT REPLICATION 授权的账号, 自动将 SQL 语法 repl 到 Slave 的 DB 执行.
- 因而完成 Replication 的动作.
操作系统:Linux
Master端IP:192.168.2.122
Slave端IP:192.168.2.123
注意:在做配置的过程中,最好不要向 Master 数据库做写入操作。
1 主机master设置
1.1 测试用数据库
1. 建立名为test1的数据库
create database test1;
2. 建立表名为test1的表
CREATE TABLE `test1` ( `id` bigint(20) unsignedNOT NULL AUTO_INCREMENT, `name` varchar(100) , PRIMARY KEY(`id`) );
3. 在表test1中插入3条测试数据
INSERT INTO `test1` VALUES (1,'name1');
INSERT INTO `test1` VALUES (2,'name2');
INSERT INTO `test1` VALUES (3,'name3');
1.2 设置Mysql Replication
1. 增加一用于数据库同步的用户root
mysql>GRANT REPLICATIONSLAVE,REPLICATION CLIENT,RELOAD,SUPER ON *.* TO'root'@'192.168.2.123' IDENTIFIED BY 'password';
(授与从192.168.2.123主机上登录用户root数据复制权限)
2. 使权限生效,这步可不做,因为过会要重启mysql
mysql>flush privileges;
3. 退出mysql命令行界面
mysql> exit
4. 停止mysql服务
service mysqld stop
5. 更改Mysql配置文件/etc/my.cnf
1) 打开mysql配置文件
vi /etc/my.cnf
2) 在配置文件中添加以下内容
#bind-address = 127.0.0.1
server-id = 1 (注意不能与其他服务器的配置一样)
log_bin = /var/log/mysql/mysql-bin.log
# 若是 innodb, 且有用 transaction 的话, 需再加入下面两行
innodb_flush_log_at_trx_commit=1
sync_binlog=1
#如果指定具体的数据库,需加入下面一行
binlog-do-db= test1
3) 记录 master status
mysql>show master status; #这边资料都要记好,等一下设定slave要用
+----------------------+------------+------------------+----------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+------------+------------------+----------------------+
| mysql-bin.000014 | 232 | | |
+----------------------+------------+------------------+----------------------+
6. 将要进行热备的数据库test1打包
tar czvf /var/lib/mysql/test1.tar.gztest1
7. 启动Mysql
service mysqld start
2 备机slave设置
1. 更改Mysql配置文件/etc/my.cnf
3) 打开Mysql的配置文件
vi /etc/my.cnf
4) 在配置文件中添加以下内容
master-host = 192.168.2.122
master-user = root
master-password = password
master-port = 3306
master-connect-retry = 10
master_log_file='mysql-bin.000014' # 这边就要用到之前 Master 抄下来的值.
master_log_pos=232 # 这边就要用到之前 Master 抄下来的值.
replicate-do-db = test1 #当需要具体到某个数据库的时候,才配置该行
2. 将先前(1.2中第6步)从master打包的数据库文件test1.ter.gz发送到备机slave的相应目录下,本次在/var/lib/mysql目录,解压文件并修改其可执行权限
cd /var/lib/mysql
tar zxvf test1.tar.gz
chmod 700 test1
chmod 660 test1
3. 重新启动Mysql服务
service mysqld restart
4. 启动slave
mysql> START SLAVE;
查看slave状态:
mysql> show slavestatus\G;
*************************** 1. row***************************
Slave_IO_State:Waiting for master to send event
Master_Host: 192.168.2.122
Master_User: root
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 582
Relay_Log_File: mysqld-relay-bin.000005
Relay_Log_Pos: 515
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: test1,test1
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter:0
Exec_Master_Log_Pos: 582
Relay_Log_Space: 515
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)
******************************************************
可以看到
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果都是yes,代表已经在同步
至此server服务器上的Mysql设置完毕
3 测试
1. 主机和备机都正常运行情况,对主机进行增加一条记录INSERT INTO `test1` VALUES(6,'name6'); 检测备机是否也增加了此条记录,经检查,数据相同
2. 主机和备机都正常运行情况,在主机没有对数据库操作的情况下测试主备数据是否一致,经查看主机和备机的的test1表,记录相同,说明备机成功复制数据。
3. 主机和备机都正常运行情况,停掉备机mysql,对主机进行添加记录的操作,然后再重启备机mysql,经检查,两边数据完全一致。
4. 主机和备机都正常运行情况,在主机执行mysql> delete fromtest1 where id=3; 检测两边数据是否一致。经检查,两边数据完全一致。