首页 > 代码库 > MySQL之主从复制的配置演示

MySQL之主从复制的配置演示


node1:192.168.139.2 主服务器

node2:192.168.139.4 从服务器


首先要在node1和node2上安装MySQL,这里不演示

然后需要对主从进行如下配置:

master:

  1. 启用二进制日志

    log_bin = master-bin  log_bin_index = master-bin.index

  2. 选一个唯一的服务器id

    server_id = {0-2^32-1}

  3. 创建具有复制权限的用户,专门用来复制

    replication slave 具有从主server上复制二进制日志中事件的权限

    replication client 具有连接主server获取相关信息的权限(这个权限不是必须的)

slave:

  1. 启动中继日志,关闭二进制日志

    relay_log = relay-log relay-log-index = relay-bin.index

  2. 选一个唯一的服务器id

    server_id = {0-2^32-1}

  3. 连接主服务器,并开始复制数据


    mysql> change master to master_host=‘192.168.139.2‘,master_user=‘faker‘,master_password=‘123‘,master_log_file=‘master-bin.000004‘,master_log_pos=579;

    mysql> start slave;启动从MySQL的复制线程


下面为配置演示

[root@node1 mysql]# vim /etc/my.cnf


[mysqld]

datadir=/mydata/data

innodb_file_per_table = 1

log-bin = master-bin

log-bin-index = master-bin.index

binlog_format=mixed

server_id = 1


[root@node1 mysql]# service mysqld start

Starting MySQL............. SUCCESS! 

root@node1 mysql]# mysql -uroot -p

Enter password: 

mysql> create user faker@‘127.0.0.1‘ identified by ‘123‘;

Query OK, 0 rows affected (0.08 sec)

mysql> grant replication slave on *.* to ‘faker‘@‘192.168.139.%‘ identified by ‘123‘;

Query OK, 0 rows affected (0.05 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.03 sec)

mysql> show master status;

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

| File         | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

| master-bin.000004 |    579 |        |              |                  

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

1 row in set (0.00 sec)


mysql> \q

Bye



[root@node2 mysql]# vim /etc/my.cnf 

[mysqld]

datadir=/mydata/data

innodb_file_per_table = ON

#log-bin = master-bin

#log-bin-index = master-bin.index

relay-log = relay-log

relay-log-index = relay-bin.index

server_id = 11


[root@node2 mysql]# service mysqld start

Starting MySQL...................... SUCCESS! 

[root@node2 mysql]# mysql -uroot -p

Enter password: 

mysql> change master to master_host=‘192.168.139.2‘,master_user=‘faker‘,master_password=‘123‘,master_log_file=‘master-bin.000004‘,master_log_pos=579;

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

mysql> show slave status\G

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

              Slave_IO_State: 

Master_Host: 192.168.139.

Master_User: faker

Master_Port: 3306

Connect_Retry: 60 如果连不到主服务器,60后再重试一次

Master_Log_File: master-bin.000004 当前读取的主服务器二进制日志

Read_Master_Log_Pos: 579    当前读取的主服务器二进制日志位置

Relay_Log_File: relay-log.000001 现在用的中继日志(可以发现和主server上不一致)

Relay_Log_Pos: 4   当前中继日志中的事件位置

Relay_Master_Log_File: master-bin.000004  正在同步的主服务器二进制日志

Slave_IO_Running: No 从服务器上的IO 线程未启用

Slave_SQL_Running: No 从服务器上的SQL线程未启用


Replicate_Do_DB: 下面几个是做复制过滤的

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 跳过了0个

Exec_Master_Log_Pos: 579 当前执行到了那个位置

Relay_Log_Space: 120 

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: NULL 从服务器比主服务器慢多少秒

Master_SSL_Verify_Server_Cert: No

Last_SQL_Errno: 0

Last_SQL_Error: 

Replicate_Ignore_Server_Ids: 

Master_Server_Id: 0

Master_UUID: 

Master_Info_File: /mydata/data/master.info

SQL_Delay: 0

SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: 

Master_Retry_Count: 86400

Master_Bind: 

Last_IO_Error_Timestamp: 

Last_SQL_Error_Timestamp: 

Master_SSL_Crl: 

Master_SSL_Crlpath: 

Executed_Gtid_Set: 

Auto_Position: 0

1 row in set (0.00 sec)


mysql> start slave;

Query OK, 0 rows affected (0.07 sec)


主:

mysql> create database zxl;

Query OK, 1 row affected (0.51 sec)


mysql> 


从:

mysql> show databases;

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

| Database       

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

| information_schema |

| mysql          

| performance_schema |

| test           

| zxl           |

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

5 rows in set (0.00 sec)


如何让从服务器只读

[root@node2 data]# vim /etc/my.cnf 

read_only = ON


[root@node2 data]# service mysqld restart

Shutting down MySQL.. SUCCESS! 

Starting MySQL................ SUCCESS! 

[root@node2 data]# mysql -uroot -p

Enter password: 

mysql> show global variables like ‘read_only‘;

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

| Variable_name | Value |

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

| read_only   | ON    |

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

1 row in set (0.12 sec)

mysql> show slave status\G

Slave_IO_Running: Yes

Slave_SQL_Running: Yes


可以看出mysql重启后IO和sql线程自动启动呢,但是IO线程要连接到主server的dump线程才能启动,且要指定用户密码,日志事件等,怎么会自动启动呢?

[root@node2 mysql]# file master.info 

master.info: ASCIItext

[root@node2 data]# cat master.info

23

master-bin.000004

670

192.168.139.2 主serverIP

faker 用户

123 密码

3306 端口

60 重试时间

0

[root@node2 data]# ll master.info 

-rw-rw----. 1 mysql mysql 125 Feb 17 15:53 master.info


[root@node2 data]# cat relay-log.info 

7

./relay-log.000002 当前使用的中继日志

375  日志位置

master-bin.000004 当前读取的二进制日志

670 二进制日志位置

0

0

1

上面两个文件master.info和relay-log.info保存了IO线程自动启动所需的内容


但是有的时候可能在主server上进行了误删除操作,这时可以利用主从复制上的时间差,立马让从server停止复制,在从server上找回在主server上误删除的数据


>stop slave; 便可直接停止sql和IO线程



Percona公司还提供了专门管理主从复制的工具:


[root@node2 data]# yum install percona-toolkit

安装完会生成许多pt开头的命令

如:


pt-slave-delay 可以有意让从复制比主慢一定时间,出错可以利用时间差补救

pt-summary   收集当前服务器的CPU和内存大小等信息

pt-diskstats 显示磁IO统计数据

pt-index-usage 显示当前索引使用情况

pt-table-checksum 检查主从上的数据是否一致

pt-ioprofile  评估当前磁盘的IO能力


本文出自 “11097124” 博客,请务必保留此出处http://11107124.blog.51cto.com/11097124/1898899

MySQL之主从复制的配置演示