node1:192.168.139.2 主服务器
node2:192.168.139.4 从服务器
首先要在node1和node2上安装MySQL,这里不演示
然后需要对主从进行如下配置:
master:
启用二进制日志
log_bin = master-bin log_bin_index = master-bin.index
选一个唯一的服务器id
server_id = {0-2^32-1}
创建具有复制权限的用户,专门用来复制
replication slave 具有从主server上复制二进制日志中事件的权限
replication client 具有连接主server获取相关信息的权限(这个权限不是必须的)
slave:
启动中继日志,关闭二进制日志
relay_log = relay-log relay-log-index = relay-bin.index
选一个唯一的服务器id
server_id = {0-2^32-1}
连接主服务器,并开始复制数据
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
原文地址:http://11107124.blog.51cto.com/11097124/1898899