复制解决的问题:
(1)数据分布
(2)负载平衡
(3)备份
(4)高可用性和容错
复制如何工作:
(1)master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2)slave将master的binary log events拷贝到它的中继日志(relay log);
(3)slave重做中继日志中的事件,将改变反映它自己的数据。
中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
MySQL主从复制配置
场景描述:
主数据库服务器:192.168.171.158,MySQL已经安装,并且无应用数据。
从数据库服务器:192.168.171.159,MySQL已经安装,并且无应用数据。
一、主服务器上进行的操作
(1)打开二进制日志,指定唯一的servr ID
修改从服务器的配置文件/etc/my.cnf
[mysqld]
log-bin=mysql-bin
server-id=1
重启mysql
service mysqld restart
(2)查询主数据库状态
mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 106
Binlog_Do_DB:
Binlog_Ignore_DB:
记录下 FILE 及 Position 的值,在后面进行从服务器操作的时候需要用到。
(3)授权给从数据库服务器192.168.171.159
mysql> GRANT REPLICATION SLAVE ON *.* to 'rep1'@'192.168.171.159' identified by '123123';
二、配置从服务器
(1)修改从服务器的配置文件/etc/my.cnf
server-id = 2
relay-log = mysql-relay-bin
read-only = ON
skip-slave-start = 1
重启mysql
service mysqld restart
说明:skip-slave-start = 1 作用:复制进程就不会随着数据库的启动而启动
(2)执行同步SQL语句
mysql> change master to master_host='192.168.171.158',
master_port=3306,
master_user='rep1',
master_password='123123',
master_log_file='mysql-bin.000001',
master_log_pos=106;
正确执行后启动Slave同步进程
mysql> start slave;
主从同步检查
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.171.158
Master_User: rep1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 262
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 407
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
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
Exec_Master_Log_Pos: 262
Relay_Log_Space: 562
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: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
==============================================
其中Slave_IO_Running 与 Slave_SQL_Running 的值都必须为YES,才表明状态正常。
如果主服务器已经存在应用数据,则在进行主从复制时,需要做以下处理:
(1)主数据库进行锁表操作,不让数据再进行写入动作
mysql> FLUSH TABLES WITH READ LOCK;
(2)查看主数据库状态
mysql> show master status;
记录下 FILE 及 Position 的值。
(3)将主服务器的数据文件(整个/opt/mysql/data目录)复制到从服务器,建议通过tar归档压缩后再传到从服务器解压。
(4)取消主数据库锁定
mysql> UNLOCK TABLES;
2.3 验证主从复制效果
主服务器上的操作
在主服务器上创建数据库first_db
mysql> create database first_db;
Query Ok, 1 row affected (0.01 sec)
在主服务器上创建表first_tb
mysql> create table first_tb(id int(3),name char(10));
Query Ok, 1 row affected (0.00 sec)
在主服务器上的表first_tb中插入记录
mysql> insert into first_tb values (001,’myself’);
Query Ok, 1 row affected (0.00 sec)
在从服务器上查看
mysql> show databases;
=============================
+--------------------+
| Database |
+--------------------+
| information_schema |
| first_db |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.01 sec)
=============================
数据库first_db已经自动生成
mysql> use first_db
Database chaged
mysql> show tables;
=============================
+--------------------+
| Tables_in_first_db |
+--------------------+
| first_tb |
+--------------------+
1 row in set (0.02 sec)
=============================
数据库表first_tb也已经自动创建
mysql> select * from first_tb;
=============================
+------+------+
| id | name |
+------+------+
| 1 | myself |
+------+------+
1 rows in set (0.00 sec)
=============================
记录也已经存在
由此,整个MySQL主从复制的过程就完成了
阅读(410) | 评论(0) | 转发(0) |