开通黄钻

81177_dec5.jpg


环境:

CentOS 6.5 x86_64位 采用最小化安装,系统经过了基本优化

selinux 为关闭状态,iptables 为无限制模式

主机名:master==>ip:192.168.1.32==>MySQL版本:mysql-5.5.38

主机名:slave ==>ip:192.168.1.33==>MySQL版本:mysql-5.5.38

源码包存放位置:/usr/local/src

源码包编译安装位置:/usr/local/mysql

数据库存放位置:/data/mysql

mysql安装过程可以参考http://www.osyunwei.com/archives/7195.html
mysql下载地址:http://cdn.mysql.com/Downloads/MySQL-5.5/mysql-5.5.38.tar.gz ;


dNrgSHGIAAAA&bo=UAGBAAAAAAABAPc%21&su=08
 

一、主从复制前环境检查

主服务器检查:

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

+---------------+----------+


二、主库执行操作

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   # 在主服务器设定,用于事务安全

提示:

1、上面两参数要放在my.cnf中的[mysqld]模块下,否则会出错

2、我们也要保证主服务器的server-id唯一。server-id的值要使用服务器ip地址的最后8位如1,目的是避免不同机器或实例ID重复,不适合多实例。server-id的范围: 0 < server-id < 2的32次方-1的自然数

3、要先在 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@'192.168.1.%' 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@'192.168.1.%';" 

+--------------------------------------------------------------------------------------+

| 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@'192.168.1.%';" 

+--------------------------------------------------------------------------------------+ 

| 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 192.168.1.33:/tmp/ 

root@172.16.100.2's password: 

master.2014-06-03.sql.gz 100% 141KB 141.0KB/s 00:00


三、从库执行操作

a、设置server-id值并关闭binlog参数

我们要对从服务器设置唯一的server-id,并且要注释掉从服务器的 binlog 参数配置。

修改后参数如下:

1

2

3

[mysqld]

server-id = 2


提示:

1、上面两参数要放在my.cnf中的[mysqld]模块下,否则会出错

2、我们也要保证主服务器的server-id唯一。server-id的值要使用服务器ip地址的最后8位如1,目的是避免不同机器或实例ID重复,不适合多实例。server-id的范围: 0 < server-id < 2的32次方-1的自然数

3、要先在 my.cnf 配置文件中查找相关参数,并按要求修改,不存在时再添加参数,切记,参数不能重复

4、修改 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' /etc/my.cnf 

server-id   = 2 


[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='192.168.1.32',    # 指定主库的 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

(注意:此处MASTER_LOG_FILE='mysql-bin.000001', 和 MASTER_LOG_POS=257;
“值”的填写应该从主master数据库查询,具体方法,请看下图:
dGne3HGXAAAA&bo=xwJPAQAAAAABAKw%21&su=03
 
上述操作的实质,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                   | 

+------------------------+



PS:最后mysql主从同步任务安装完毕,可能安装过程中会遇上各种问题,具体问题具体对待,多google和百度