Replication是MySQL提供的数据库同步复制功能,增强了MySQL数据库的稳定性,对我们实现数据库的容灾、备份带来了极大好处。优点是配置简单并且MySQL自身的replicate消耗整体资源不到1%。
1.安装MySQL
1)在linux镜像中自带mysql安装包,找到:
mysql-server-5.1.61-4.el6.x86_64
mysql-libs-5.1.61-4.el6.x86_64
mysql-5.1.61-4.el6.x86_64
mysql-devel-5.1.61-4.el6.x86_64
2)以root用户安装MySQL:
[root@vmx80 11]# yuminstall mysql
[root@vmx80 11]# rpm-qa|grepmysql
mysql-server-5.1.61-4.el6.x86_64
mysql-libs-5.1.61-4.el6.x86_64
mysql-5.1.61-4.el6.x86_64
mysql-devel-5.1.61-4.el6.x86_64
[root@vmx80 11]#chkconfig–level 2345 mysqld on
3)mysql的默认目录:
数据库目录:/var/lib/mysql
配置文件目录:/usr/share/mysql
2.配置master
原理:
1、创建用于复制的数据库用户;
2、配置my.cnf;
3、通过dump方式把所需要备份数据库表导出来传到slave端。
步骤:
1)在指定库中创建一张测试表测试同步复制:
[root@vmx80 mysql]#mysql -u root -p
mysql> use test
mysql> create tablecs8(id int);mysql> show tables;
mysql> insert intocs8 values(5);
2) 创建用于数据库同步用户replicate
mysql> grant allprivileges on *.* to 'replicate'@'10.1.1.2' identified by 'replicate';
使设置生效:
mysql> flushprivileges;
3) 停止Mysql服务
[root@vmx80 mysql]#service mysqld stop
4) 更改配置文件/etc/my.cnf
[root@vmx80 mysql]# vi/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
server-id=80
log-bin=mysql-bin
# 1master特有参数
binlog-do-db=test #如果是要同步多个数据库可以在添加一条binlog-do-db=hive1
binlog_format=ROW
binlog-ignore-db=mysql
expire_logs_days=10 #binlog只保留最近10天的,超过10天为过期自动被删除
# 2下面是切换后作为slave端需要设置的参数,且需注释掉1中参数
relay_log=mysql-relay-bin
replicate-do-db=test
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#####标红注释
l Log-bin:启动二进制日志文件
l Binlog-do-db:二进制需要同步的数据库名
l binlog-ignore-db=mysql:不同步的数据库名
l Server-id:本机数据库ID
l Binlog_format:一共有三种复制方式:ROW\STATEMENT\MIXED,默认是STATEMENT
5)通过dump方式导出备份库表数据
[root@vmx80 mysql]# cd/var/lib/mysql
[root@vmx80 mysql]# mysqldump-uroot -p test >test.sql
[root@vmx80 mysql]# scp test.sqlroot@10.1.1.2:/var/lib/mysql/
6、 启动mysql
[root@vmx80 mysql]#service mysqld start
3.配置slave
原理:
1)创建用于复制的数据库用户;
2)创建需要同步的数据库;
3)配置my.cnf;
4)把master传过来的dump导入数据库;
步骤:
1) 创建用于复制的数据库用户:
[root@vmx81]# mysql-uroot -p
mysql> grant allprivileges on *.* to 'replicate'@'10.1.1.1' identified by 'replicate';
让权限生效:
mysql> flushprivileges;
2) 创建需要同步的数据库:
mysql> createdatabase test;--如果slave端没有这个数据库
3) 配置my.cnf:
[root@vmx81 /]# vi/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
server-id=81
log-bin=mysql-bin
# 1 slave特有参数
relay_log=mysql-relay-bin
replicate-do-db=test #如果同步多个数据库可以添加一条replicate-do-db=hive1
# 2 下面是切换后作为master端需要设置的参数,且需注释掉1中参数
binlog_format=ROW
binlog-do-db=test
binlog-ignore-db=mysql
expire_logs_days=10 #binlog只保留最近10天的,超过10天为过期自动被删除
####注释:
l server-id为数据库ID,不要和同一个master-slave架构中的其他server-id重复
l log-bin启用二进制文件
l relay_log启用从库二进制文件
l replicate-do-db同步的数据库名`
4) 重启mysql服务以应用配置文件更改项:
[root@vmx81 /]# service mysqldrestart
5) 导入master备份库的dump文件:
[root@vmx81 /]#mysql -uroot -p test < test.sql
4.开启同步复制:
1)在master端:
mysql> change masterto master_host='10.1.1.2',master_user='replicate', master_password='replicate', master_port=3306,master_log_file='mysql-bin.000001', master_log_pos=106;
2) 在slave端:
mysql> change masterto master_host='10.1.1.1',master_user='replicate', master_password='replicate', master_port=3306,master_log_file='mysql-bin.000001', master_log_pos=106;
其中各项参数含义如下:
l master_host master主机IP地址
l master-user数据同步的用户
l master-password数据同步的用户密码
l master-port同步使用端口
l master_log_file开始同步时读取的初始master二进制文件,通过master端执行show master status查看得到
l master_log_pos开始同步时读取的初始master二进制文件Position, 通过master端执行show master status查看得到
5.同步测试
目标:
1) 检查master状态;
2) 检查slave状态;
3) 同步之前master端数据表已恢复到slave端;
4) 同步开启后master端与slave端数据双向同步复制;
步骤:
1) 检查master端状态:
mysql> show masterstatus; #检查作为master的状态
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB |Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000012| 406 | test | |
mysql> show slavestatus \G #检查作为slave的状态
***************************1. row ***************************
Read_Master_Log_Pos: 106
Relay_Log_File:mysql-relay-bin.000026
Relay_Log_Pos: 251
Relay_Master_Log_File:mysql-bin.000012
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
2) 检查slave端状态:
mysql> show masterstatus; #检查作为master的状态
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB |Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000012| 106 | test | |
mysql> show slavestatus \G; #检查作为master的状态
***************************1. row ***************************
Read_Master_Log_Pos: 406
Relay_Log_File:mysql-relay-bin.000035
Relay_Log_Pos: 551
Relay_Master_Log_File: mysql-bin.000012
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3) 检查同步之前的数据:
mysql> select * fromcs8;
| id |
+------+
| 5 |
4)测试双向同步复制:
a) Master端向slave端同步数据:
Master端:
mysql> create tablecs9(id int);
mysql> insert intocs9 values(9);
slave端:
mysql> select * fromcs9;
| id |
+------+
| 9 |
b) slave端向master端同步数据:
Slave端:
mysql> create tablecscs(id int);
mysql> insert intocscs values(33);
master端:
mysql> select * fromcscs;
+------+
| id |
+------+
| 33 |
+------+
至此,mysql已经设置完毕。