mysql系列之复制2----主从同步部署mysql
原做品出处:http://nolinux.blog.51cto.com/4824967/1530108linux
通过了上一篇mysql系列之复制1----原理篇,相信你们已经对mysql的复制有所了解了。本篇博文将带你们一块儿来部署下mysql的主从同步架构。sql
1
2
3
4
5
6
7
8
|
环境:
CentOS 6.5 x86_64位 采用最小化安装,系统通过了基本优化
selinux 为关闭状态,iptables 为无限制模式
主机名:master==>ip:172.16.100.1==>MySQL版本:mysql-5.5.32
主机名:slave ==>ip:172.16.100.2==>MySQL版本:mysql-5.5.32
源码包存放位置:/usr/local/src
源码包编译安装位置:/usr/local/mysql
数据库存放位置:/mydata
|
架构图:数据库
1、主从复制前环境检查安全
主服务器检查:服务器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@master ~]# hostname
master
[root@master ~]# uname -a
Linux master 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@master ~]# mysql -uroot -psunsky -e 'select version();'
+------------+
| version() |
+------------+
| 5.5.32-log |
+------------+
[root@master ~]# mysql -uroot -psunsky -e "show variables like '%datadir%';"
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| datadir | /mydata/ |
+---------------+----------+
|
从服务器检查:架构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@slave ~]# hostname
slave
[root@slave ~]# uname -a
Linux slave 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@slave ~]# mysql -uroot -psunsky -e 'select version();'
+-----------+
| version() |
+-----------+
| 5.5.32 |
+-----------+
[root@slave ~]# mysql -uroot -psunsky -e "show variables like '%datadir%';"
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| datadir | /mydata/ |
+---------------+----------+
|
2、主库执行操做ide
a、设置server-id值并开启binlog参数测试
因为咱们知道,mysql的主从同步的关键因素就是 binlog 日志,因此咱们须要先在主服务器打开 binlog 日志的功能。而且,咱们也要保证主服务器的server-id惟一,通常咱们都将主服务器的server-id设置为1.优化
下面是须要修改的内容:
1
2
3
4
5
|
[mysqld]
server-id = 1
log-bin = /mydata/mysql-bin # 设定binlog日志的位置
binlog_format=mixed # 设定 binlog 日志格式为混合格式
sync-binlog = 1 # 在主服务器设定,用于事务安全
|
提示:
一、上面两参数要放在my.cnf中的[mysqld]模块下,不然会出错
二、咱们也要保证主服务器的server-id惟一。server-id的值要使用服务器ip地址的最后8位如1,目的是避免不一样机器或实例ID重复,不适合多实例。server-id的范围: 0 < server-id < 2的32次方-1的天然数
三、要先在 my.cnf 配置文件中查找相关参数,并按要求修改,不存在时再添加参数,切记,参数不能重复
b、修改 my.cnf 配置后重启数据库
1
2
3
|
[root@master ~]# /etc/init.d/mysqld restart
Shutting down MySQL. SUCCESS!
Starting MySQL.. SUCCESS!
|
检查配置后的结果:
检查方法一:
1
2
3
4
5
|
[root@master ~]# egrep 'server-id|log-bin|binlog_format|sync' /etc/my.cnf
server-id = 1
log-bin = /mydata/mysql-bin
binlog_format=mixed
sync-binlog = 1
|
检查方法二:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
[root@master ~]# mysql -uroot -psunsky -e "show variables like 'log_bin';"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
[root@master ~]# mysql -uroot -psunsky -e "show variables like '%server_id%'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
[root@master ~]# mysql -uroot -psunsky -e "show variables like 'binlog_format';"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+
[root@master ~]# mysql -uroot -psunsky -e "show variables like 'sync_binlog';"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog | 1 |
+---------------+-------+
|
c、创建用于同步的帐号rep
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[root@master ~]# mysql -uroot -psunsky -e "grant replication slave on *.* to rep@'172.16.100.%' identified by 'sunsky';"
[root@master ~]# mysql -uroot -psunsky -e "select user,host from mysql.user where user='rep';"
+------+--------------+
| user | host |
+------+--------------+
| rep | 172.16.100.% |
+------+--------------+
[root@master ~]# mysql -uroot -psunsky -e "show grants for rep@'172.16.100.%';"
+--------------------------------------------------------------------------------------+
| Grants for rep@172.16.100.% |
+--------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'rep'@'172.16.100.%' IDENTIFIED BY PASSWORD '*5C275EDDF185436A097C27336FB99357638439A4' |
+--------------------------------------------------------------------------------------+
[root@master ~]# mysql -uroot -psunsky -e "show grants for rep@'172.16.100.%';"
+--------------------------------------------------------------------------------------+
| Grants for rep@172.16.100.% |
+--------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'rep'@'172.16.100.%' IDENTIFIED BY PASSWORD '*5C275EDDF185436A097C27336FB99357638439A4' |
+--------------------------------------------------------------------------------------+
|
d、对数据库锁表只读,并查看主库状态以及导出数据库数据
因为对数据库锁表后,不能退出当前的会话,一旦退出就自动解锁了。所以,咱们将锁表、查看主库状态以及导出数据库数据放到一步来作!
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@master ~]# mkdir /bak
[root@master ~]# mysql -uroot -p'sunsky' << EOF
flush tables with read lock;
system echo '----show master status result----'
system mysql -uroot -p'sunsky' -e "show master status"
system mysqldump -uroot -p'sunsky' -A -B --events|gzip > /bak/master.$(date +%F).sql.gz
EOF
----show master status result----
File Position Binlog_Do_DB Binlog_Ignore_DB
mysql-bin.000001 257
[root@master ~]# ll /bak/master.2014-06-03.sql.gz
-rw-r--r--. 1 root root 144360 Jun 3 23:50 /bak/master.2014-06-03.sql.gz
|
注意:
在执行锁表命令的时候,在不一样的引擎的状况,会受下面参数的控制。锁表的时候,若是超过设置的时间不操做会自动解锁。主要受下面2个参数影响!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@master ~]# mysql -uroot -p'sunsky' -e "show variables like '%timeout%';"
+--------------------------------+-----------+
| Variable_name | Value |
+--------------------------------+-----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| slave_net_timeout | 3600 |
| wait_timeout | 28800 |
+--------------------------------+-----------+
|
e、把主库备份的MYSQL数据迁移到从库
1
2
3
|
[root@master ~]# scp /bak/master.2014-06-03.sql.gz 172.16.100.2:/tmp/
root@172.16.100.2's password:
master.2014-06-03.sql.gz 100% 141KB 141.0KB/s 00:00
|
3、从库执行操做
a、设置server-id值并关闭binlog参数
咱们要对从服务器设置惟一的server-id,而且要注释掉从服务器的 binlog 参数配置。
修改后参数以下:
1
2
3
|
[mysqld]
server-id = 2
#log-bin = /data/3307/mysql-bin
|
提示:
一、上面两参数要放在my.cnf中的[mysqld]模块下,不然会出错
二、咱们也要保证主服务器的server-id惟一。server-id的值要使用服务器ip地址的最后8位如1,目的是避免不一样机器或实例ID重复,不适合多实例。server-id的范围: 0 < server-id < 2的32次方-1的天然数
三、要先在 my.cnf 配置文件中查找相关参数,并按要求修改,不存在时再添加参数,切记,参数不能重复
四、修改 my.cnf 配置后须要重启数据库
另外,在如下两种状况下,咱们须要在从服务器上打开 log-bin 来记录数据库更新的sql语句:
1
2
|
a、级联同步,A==>B==>C 那中间的B就要开启log-bin
b、在从库作数据库备份,数据库备份必需要有全备 + binlog
|
检查配置后的结果:
1
2
3
4
5
|
[root@slave ~]# egrep 'server-id|log-bin' /etc/my.cnf
server-id = 2
#log-bin=mysql-bin
[root@slave ~]# /etc/init.d/mysqld stop
[root@slave ~]# /usr/local/mysql/bin/mysqld_safe --skip-slave-start &
|
b、还原主库导出的数据到从库
1
2
3
4
5
6
|
[root@slave ~]# ll /tmp/master.2014-06-03.sql.gz
-rw-r--r--. 1 root root 144360 Jun 4 02:10 /tmp/master.2014-06-03.sql.gz
[root@slave ~]# gunzip /tmp/master.2014-06-03.sql.gz
[root@slave ~]# ll /tmp/master.2014-06-03.sql
-rw-r--r--. 1 root root 528663 Jun 4 02:10 /tmp/master.2014-06-03.sql
[root@slave ~]# mysql -uroot -psunsky < /tmp/master.2014-06-03.sql
|
c、登录从库配置同步参数
1
2
3
4
5
6
7
8
9
|
[root@slave ~]# mysql -uroot -psunsky << EOF
> CHANGE MASTER TO
> MASTER_HOST='172.16.100.1', # 指定主库的 IP 地址
> MASTER_PORT=3306, # 指定主库的端口
> MASTER_USER='rep', # 指定负责同步的用户为rep
> MASTER_PASSWORD='sunsky', # rep用户的密码
> MASTER_LOG_FILE='mysql-bin.000001', #这里是经过 show master status 看到的二进制日志文件名称,注意不能多空格
> MASTER_LOG_POS=257; #这里是经过 show master status 时查看到的二进制日志偏移量,注意不能多空格
> EOF
|
上述操做的实质,mysql会把用户和密码等信息写入到 master.info 文件中
d、启动从库同步开关
接下来,咱们启动从库同步的开关,而且查看从库的同步状态
1
2
3
4
5
|
[root@slave ~]# mysql -uroot -psunsky -e 'slave start'
[root@slave ~]# mysql -uroot -p'sunsky' -e 'show slave status\G'|egrep "Seconds_Behind_Master|_Running"
Slave_IO_Running: Yes # I/O线程运行是否正常
Slave_SQL_Running: Yes # SQL线程运行是否正常
Seconds_Behind_Master: 0 # 同步延时
|
e、测试复制结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
[root@master ~]# mysql -uroot -psunsky -e "create database sunsky; "
[root@master ~]# mysql -uroot -p'sunsky' -e "show databases;"
+------------------------+
| Database |
+------------------------+
| information_schema |
| mysql |
| performance_schema |
| sunsky |
| test |
+------------------------+
[root@slave ~]# mysql -uroot -p'sunsky' -e "show databases;"
+------------------------+
| Database |
+------------------------+
| information_schema |
| mysql |
| performance_schema |
| sunsky |
| test |
+------------------------+
|
OK!
这样子,咱们的MySQL主从同步架构就部署完成了!但愿能对你们有所帮助!
本文出自 “Not Only Linux” 博客,请务必保留此出处http://nolinux.blog.51cto.com/4824967/1530108