60.MySQL主从配置 与测试

17.1 MySQL主从介绍html

17.2 准备工做mysql

17.3 配置主linux

17.4 配置从web

17.5 测试主从同步sql

有的同窗,遇到主从不能正常同步,提示uuid相同的错误。这是由于克隆机器致使。数据库

https://www.2cto.com/database/201412/364479.htmlvim

 

 

 

17.1 MySQL主从介绍:缓存

 

 

 

 

 

~1.服务器

MySQL主从又叫作Replication、AB复制。简单讲就是A和B两台机器作主从后,在A上写数据,另一台B也会跟着写数据,二者数据实时同步的socket

好比对一个表插入了一行数据,那B机器上的这个表也会一样的插入一行数据

~2.

MySQL主从是基于binlog的,主上须开启binlog才能进行主从。

binlog是二进制的。好比主机器插入一行都会记录在binlog里,而后从机器,将主的binlog同步到从机器上,并记录在从机器本身的binlog里。咱们把它叫作relaylog,中文叫中继日志,他会按照这个relaylog,严格按顺序执行

主从过程大体有3个步骤

1)主将更改操做记录到binlog里

2)从将主的binlog事件(sql语句)同步到从本机上并记录在relaylog里

3)从根据relaylog里面的sql语句按顺序执行

主上有一个log dump线程,用来和从的I/O线程传递binlog

从上有两个线程,其中I/O线程用来同步主的binlog并生成relaylog,另一个SQL线程用来把relaylog里面的sql语句落地

 

 

!!简单来说就是,从会把主上的binlog搞到从上来。而后从会根据这个binlog生成本身的relaylog(中继日志),而后再根据这个relaylog来执行相应的更改。最终达到两边数据一致(执行主上的各类各样的操做)

 

应用场景:

1. 咱们要作数据的备份。可能只是针对主这一台作读写操做,而从备份的数据就单纯的来备份。加入主硬件损坏,那么咱们能够随时把从机器启动起来,给客户端提供服务

2. 不只是备份,web服务端还能够从上读数据。正常状况下写数据要写到主上,那读的话也要到主上去读。假如主压力比较大,能够在从上作一个读。那么web服务器就能够去从上读数据。减轻主的压力

!!可是不能再从上写数据。由于主从是有一个方向性的。数据是从主这边过来的,那么从就不能写。否则会紊乱

 

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

 

17.2 准备工做:

 

 

将两台都安装MySQL

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

17.3 配置主:

 

 

 

~1.

安装mysql

~2.

修改my.cnf,增长server-id=130和log_bin=aminglinux1

log_bin=aminglinux1这个是前缀,ls -l看的时候会看到不少以aminginux1开头的文件,这些文件是实现主从的根本

~3.

修改完配置文件后,启动或者重启mysqld服务

~4.

把mysql库备份并恢复成aming库,做为测试数据

mysqldump -uroot mysql > /tmp/mysql.sql 备份一个库

mysql -uroot -e “create database aming” 建立一个库

mysql -uroot aming < /tmp/mysql.sql 将备份的那个库重定向到新建立的库里

~5.建立用做同步数据的用户

grant replication slave on *.* to 'repl'@slave_ip identified by 'password';

进入到mysql,权限replication就能够了。@就是指定从的IP,不要全部会很危险

~6.

flush tables with read lock; 把表锁一下。目的是不要让他在写了。就是如今到此,数据暂停,状态保持在这。由于一会从要把备份的数据同步一下,二者保持一致,这样才能实现一致

~7.

show master status;

记住file name 和position,一会会用到

 

 

实例:

[root@axinlinux-01 ~]# vim /etc/my.cnf

[mysqld]

datadir = /data/mysql

# port = .....

# server_id = .....

socket = /tmp/mysql.sock

server-id = 130

log_bin = aminglinux1

[root@axinlinux-01 ~]# /etc/init.d/mysqld restart

Shutting down MySQL.. SUCCESS!

Starting MySQL.. SUCCESS!

[root@axinlinux-01 mysql]# ls -lt

总用量 110796

-rw-rw---- 1 mysql mysql 50331648 9月 1 23:34 ib_logfile0

-rw-rw---- 1 mysql mysql 12582912 9月 1 23:34 ibdata1

-rw-rw---- 1 mysql mysql 178443 9月 1 23:34 axinlinux-01.err 会看到咱们设置的前缀,这些前缀为amiglinux1的文件就是实现主从的根本

-rw-rw---- 1 mysql mysql 5 9月 1 23:34 axinlinux-01.pid

drwx------ 2 mysql mysql 4096 9月 1 23:34 mysql

-rw-rw---- 1 mysql mysql 21 9月 1 23:34 aminglinux1.index

-rw-rw---- 1 mysql mysql 120 9月 1 23:34 aminglinux1.000001 这就是那个binlog,那个2进制文件

drwx------ 2 mysql mysql 324 8月 30 16:50 zrlog

[root@axinlinux-01 mysql]# mysqldump -uroot -pwangxin789 zrlog > /tmp/zrlog.sql 把以前的zrlog作个备份

[root@axinlinux-01 mysql]# du -sh /tmp/zrlog.sql 看一下这个备份

12K /tmp/zrlog.sql

[root@axinlinux-01 mysql]# mysql -uroot -pwangxin789 -e "create database aming" 建立一个叫aming的库

[root@axinlinux-01 mysql]# mysql -uroot -pwangxin789 aming < /tmp/zrlog.sql 把zrlog重定向到aming里

root@axinlinux-01 mysql]# ls -lh

总用量 221M

drwx------ 2 mysql mysql 324 9月 1 23:49 aming

-rw-rw---- 1 mysql mysql 11K 9月 1 23:49 aminglinux1.000001 看一下这个2进制的文件,是有增加的,正好对应了咱们重定向的zrlog的大小,说明他完完整整记录了数据库的建立过程

[root@axinlinux-01 mysql]# mysql -uroot -pwangxin789

MySQL [(none)]> grant replication slave on *.* to 'repl'@'192.168.208.130' identified by 'wangxin789';

Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> flush tables with read lock;

Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> show master status;

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

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

| aminglinux1.000001 | 10920 | | | |

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

1 row in set (0.00 sec)

MySQL [(none)]> exit

Bye

[root@axinlinux-01 mysql]# ls 看一下。aming和zrlog已经作了备份,name咱们再把db1和mysql2作一个备份。mysql不用备份,由于里面存放的是用户密码

aming aminglinux1.index axinlinux-01.err db1 ib_logfile0 mysql performance_schema zrlog

aminglinux1.000001 auto.cnf axinlinux-01.pid ibdata1 ib_logfile1 mysql2 test

[root@axinlinux-01 mysql]# mysqldump -uroot -pwangxin789 mysql2 > /tmp/my2.sql

[root@axinlinux-01 mysql]# mysqldump -uroot -pwangxin789 db1 > /tmp/db1.sql

[root@axinlinux-01 mysql]# ls /tmp/*sql 咱们会把tmp下的全部sql文件拷贝到从上去

/tmp/db1.sql /tmp/my2.sql /tmp/mysql_all.sql /tmp/mysql.sql /tmp/user2.sql /tmp/user.sql /tmp/zrlog.sql

 

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

 

 

17.4 配置从:

 

 

 

~1.

安装mysql

~2.

查看my.cnf,配置server-id=132,要求和主不同

从不须要配置log_bin

修改完配置文件后,启动或者重启mysqld服务

~3.

把主上aming库同步到从上

能够先建立aming库,而后把主上的/tmp/mysql.sql拷贝到从上,而后导入aming库

mysql> create database aming;

mysql -uroot zrlog < /tmp/zrlog.sql

~4. 如下实现主从

1.mysql -uroot 先登陆

2.stop slave;

3.change master to master_host='192.168.208.128', master_user='repl', master_password='wangxin789', master_log_file='aminglinux1.000001', master_log_pos=10920;

这是实现主从的关键一步

指定master_host=主的IP

也能够指定port,master_port默认是3306,因此不指定了

指定master_user='repl' 用户为repl

指定master_password='' 密码

指定master_log_file='' 日志的文件明。主上show master status; File的内容

指定master_log_pos= 日志的数值。主上show master status; Position的内容(就是在配置主的时候show master status;时,须要记住的)

~5.

start slave;

show slave status\G 查看是否配置成功:

查看Slave_IO_Running: Yes

Slave_SQL_Running: Yes是否是两个Yes。即便有一个是No,就表明主从已经断开

 

~6.

还要到主上执行 unlock tables;

以前不是锁住了吗。不要忘记到主上在恢复写的这个操做

 

 

实例:

[root@axinlinux-02 mysql]# vi /etc/my.cnf

[mysqld]

server_id = 132 和主不同就能够

[root@axinlinux-02 mysql]# /etc/init.d/mysqld restart

[root@axinlinux-02 mysql]# ls 看一下实际上是没有什么变化的

auto.cnf axinlinux-02.err axinlinux-02.pid ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema test

[root@axinlinux-02 mysql]# scp 192.168.208.128:/tmp/*.sql /tmp/

The authenticity of host '192.168.208.128 (192.168.208.128)' can't be established.

ECDSA key fingerprint is SHA256:2YEHWSxuaj+NF8PI1ipI8BeYOqoajfpRICmS59xgQEw.

ECDSA key fingerprint is MD5:3e:75:16:b7:8e:40:10:0f:f3:e9:79:34:48:69:2a:e4.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '192.168.208.128' (ECDSA) to the list of known hosts.

root@192.168.208.128's password:

db1.sql 100% 1256 566.8KB/s 00:00

my2.sql 100% 645KB 10.8MB/s 00:00

mysql_all.sql 100% 1289KB 8.1MB/s 00:00

mysql.sql 100% 645KB 4.1MB/s 00:00

user2.sql 100% 0 0.0KB/s 00:00

user.sql 100% 7244 251.7KB/s 00:00

zrlog.sql 100% 10KB 794.8KB/s 00:00

[root@axinlinux-02 mysql]# alias 'mysql=/usr/local/mysql/bin/mysql' 直接设置别名把,先不设置环境变量了

[root@axinlinux-02 mysql]# alias 'mysqldump=/usr/local/mysql/bin/mysqldump'

[root@axinlinux-02 mysql]# mysql -uroot

mysql> create database aming; 建立要恢复的库

Query OK, 1 row affected (0.00 sec)

mysql> create database zrlog;

Query OK, 1 row affected (0.01 sec)

mysql> create database db1;

Query OK, 1 row affected (0.00 sec)

mysql> create database mysql2;

Query OK, 1 row affected (0.00 sec)

[root@axinlinux-02 mysql]# mysql -uroot zrlog < /tmp/zrlog.sql 开始恢复

[root@axinlinux-02 mysql]# mysql -uroot mysql2 < /tmp/my2.sql

[root@axinlinux-02 mysql]# mysql -uroot db1 < /tmp/db1.sql

[root@axinlinux-02 mysql]# mysql -uroot aming < /tmp/zrlog.sql

以上数据恢复完成。下面实现主从:

[root@axinlinux-02 mysql]# mysql -uroot

mysql> stop slave;

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> change master to master_host='192.168.208.128', master_user='repl', master_password='wangxin789', master_log_file='aminglinux1.000001', master_log_pos=10920;

Query OK, 0 rows affected, 2 warnings (0.06 sec)

mysql> start slave;

Query OK, 0 rows affected (0.02 sec)

mysql> show slave status\G 查看是否配置成功

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.208.128

Master_User: repl

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: aminglinux1.000002

Read_Master_Log_Pos: 120

Relay_Log_File: axinlinux-02-relay-bin.000003

Relay_Log_Pos: 285

Relay_Master_Log_File: aminglinux1.000002

Slave_IO_Running: Yes 这是否是两个YES

Slave_SQL_Running: Yes

Last_IO_Errno: 0

Last_IO_Error: 也能够看有没有error信息

Last_SQL_Errno: 0

Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 130

Master_UUID: 8bd974f2-9c97-11e8-9aa2-000c29874224

Master_Info_File: /data/mysql/master.info

SQL_Delay: 0

SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it 这也能看到他的信息

Master_Retry_Count: 86400

[root@axinlinux-01 mysql]# mysql -uroot -pwangxin789 别忘记回到主上,恢复写操做

MySQL [(none)]> unlock tables; 以前主上配置不是锁住了,如今配置成功要解锁

Query OK, 0 rows affected (0.00 sec)

 

 

 

 

 

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

 

 

 

17.5 测试主从同步:

 

 

 

 

 

查看主从同步是否正常:

从上执行mysql -uroot

show slave status\G

看是否有

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

还需关注

Seconds_Behind_Master: 0 //为主从延迟的时间

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

 

 

几个配置参数:

如下配置是在/etc/my.cnf里配置的,能够在主上、从上均可以配置

~~1.

主服务器上:

binlog-do-db= //仅同步指定的库

用这个参数定义你要同步的库。假如主从就想同步一个库,好比zrlog。就能够在主上加入binlog-do-db=zrlog。若是有多个用逗号分隔

binlog-ignore-db= //忽略指定库

就是假如定义除了zrlog这个库,其余的库都要同步。就能够写binlog-ignore-db=zrlog

~~2.

从服务器上(同理在从上也能够定义):

replicate_do_db= 以上同理

replicate_ignore_db= 以上同理

replicate_do_table=

不想同步库里的某一个表。好比临时表,数据丢了也无所谓

可是会有必定的问题。好比咱们忽略了mysql。若是他的sql语句里有use mysql,那么他检测到了use mysql,后面的操做都不会记录到中继日志里去了。就会致使数据不完整

因此尽可能不要使用 replicate_do_table=和replicate_ignore_table=。之后在作忽略的时候尽可能用下面两个(不支持用逗号分隔多写,每一个表或库用一行写)

replicate_ignore_table=

!!因此,之后在作某一个库或表,或忽略某一个库或表的时候,用下面这两个就能够了。由于支持库(点)表。也支持库(点)统配,以上四个均可以不用:

!replicate_wild_do_table= //如aming.%, 支持通配符%

不想同步某一个表的时候,可指定那个库里的表,也支持统配。用点来分隔

!replicate_wild_ignore_table=

忽略某一个表的时候,可指定哪一个库里的表,支持统配。用点来分隔

 

 

 

 

测试主从:

 

主上 mysql -uroot aming

select count(*) from db;

truncate table db;

到从上 mysql -uroot aming

select count(*) from db;

主上继续drop table db;

从上查看db表

 

 

实例:

先查看表的行数是否一致:

[root@axinlinux-01 ~]# mysql -uroot -pwangxin789 主上登陆mysql

MySQL [(none)]> use aming 切换到aming库

MySQL [aming]> show tables; 查看他的表,有下面这九个

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

| Tables_in_aming |

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

| comment |

| link |

| log |

| lognav |

| plugin |

| tag |

| type |

| user |

| website |

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

9 rows in set (0.00 sec)

MySQL [aming]> select count(*) website; 咱们再查看一下website表里有多少行

+---------+

| website |

+---------+

| 1 |

+---------+

1 row in set (0.00 sec)

[root@axinlinux-02 ~]# mysql -uroot 回到从上

mysql> use aming; 同样切换到aming

mysql> show tables; 同样查看他的表

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

| Tables_in_aming |

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

| comment |

| link |

| log |

| lognav |

| plugin |

| tag |

| type |

| user |

| website |

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

9 rows in set (0.00 sec)

mysql> select count(*) website; 同样查看他有多少行。是跟主上都是同样的

+---------+

| website |

+---------+

| 1 |

+---------+

1 row in set (0.03 sec)

清空后再查看是否同步

MySQL [aming]> truncate table website; 咱们再在主上清空这个表

Query OK, 0 rows affected (0.04 sec)

MySQL [aming]> select count(*) website; 查看他的行数,仍是显示一行。是由于缓存。咱们用*看一下

+---------+

| website |

+---------+

| 1 |

+---------+

1 row in set (0.00 sec)

MySQL [aming]> select * from website; 是为空的

Empty set (0.00 sec)

mysql> select * from website; 咱们再回到从上,查看这个表。显示也为空

Empty set (0.00 sec)

把表drop掉查看是否同步

MySQL [aming]> drop table website; 主上drop掉这个表

Query OK, 0 rows affected (0.02 sec)

mysql> select * website; 从上查看这个表没有了

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'website' at line 1

咱们在从上把aming这个库直接给干掉(生产环境中不要这么作)。而且从新配置主从:

mysql> drop database aming; 在从上drop掉aming库

Query OK, 8 rows affected (0.18 sec)

mysql> show slave status\G 再来查看

Slave_IO_Running: Yes 如今虽然都是Yes

Slave_SQL_Running: Yes

MySQL [aming]> drop database aming; 再回到主上再drop一遍aming

Query OK, 8 rows affected (0.13 sec)

mysql> show slave status\G 再回到从上查看。发现Running为No,而且有报错了。提示没有这个库

Slave_IO_Running: Yes

Slave_SQL_Running: No

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 1008

Last_Error: Error 'Can't drop database 'aming'; database doesn't exist' on query. Default database: 'aming'. Query: 'drop database aming'

由于在主上删除了,那么在从上又会再删一次。这时候就会遇到问题,一旦遇到问题,主从就断掉了。咱们能够先试着这样修复:

mysql> stop slave; 先stop

Query OK, 0 rows affected (0.00 sec)

mysql> start slave; 再start。看能不能起来

Query OK, 0 rows affected (0.02 sec)

mysql> show slave status\G 咱们再来看一下。仍是不行,为No,也有报错

Slave_IO_Running: Yes

Slave_SQL_Running: No

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 1008

Last_Error: Error 'Can't drop database 'aming'; database doesn't exist' on query. Default database: 'aming'. Query: 'drop database aming'

若是这样不行,那就只能重新作主从了(在主上show master status;记录position这一步开始作就能够,由于目前来讲这个数据仍是一致的,没有作过其余的操做)

MySQL [(none)]> show master status; 主上再查看一下 File 和 Position

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

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

| aminglinux1.000004 | 435 | | | |

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

1 row in set (0.00 sec)

mysql> stop slave; 从上再stop slave

Query OK, 0 rows affected (0.01 sec)

mysql> change master to master_host='192.168.208.128', master_user='repl', master_password='wangxin789', master_log_file='aminglinux1.000004', master_log_pos=435;

从上再从新change master

Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> start slave; 从上再从新start slave

Query OK, 0 rows affected (0.01 sec)

mysql> show slave status\G 从上再查看一下

Slave_IO_Running: Yes 都为Yes

Slave_SQL_Running: Yes

相关文章
相关标签/搜索