复制是指将主数据库的DDL和DML操作通过二进制日志(二进制日志保存了master上的所有改变,并且可以在slave上重新执行)传到从服务器上,然后在从服务器上对这些日志重新执行,从而使从服务器和主服务器的数据保持同步。
mysql支持一台主服务器同时项多台从服务器进行复制,从服务器同时可以作为其他服务器的主服务器,实现链状的复制。
mysql复制的优点:
a、如果主服务器出现故障,可以快速切换到从服务器提供服务
b、可以在从服务器上执行查询操作,降低主服务器的访问压力
d、可以在从服务器上执行备份,以避免备份期间影响主服务器的服务
横向扩展:使用复制最多的应用。为了减少主机点上的负载,搭建一个从节点来用于相应读操作。通过一个负载均衡服务器,将读操作重定向到合适的从节点上,而写请求交由主节点处理。事务首先在主节点上提交,然后复制给从节点并且在节点上应用;这样使用的异步复制比同步复制更快,更具有可扩展性。
配置Master(10.0.8.29):
将服务器配置为master,确保该服务器有一个活动的二进制日志和唯一的服务器ID。服务器ID用于区分服务器。具体配置如下:
vi /usr/local/mysql5/etc/my.cnf //添加如下几行
log-bin=mysql-bin
binlog-format=mixed //日志类型有普通日志,二进制日志和混合日志。此为mixed混合日志
server-id=1
添加一个复制用户,并赋予一定的权限
create user repuser;
grant replication slave on *.* to 'repuser'@'10.0.8.30' identified by 'aixocm';
flush privileges; //刷新权限
show master status; //查看主服务器的状态
show master status; //查看主服务器的状态
replication slave权限只是使这个用户可以从master上取得二进制日志的转储数据。
配置slave(10.0.8.30):
与master一样,给slave分配一个唯一的服务器ID。配置如下:
vi /usr/local/mysql5/etc/my.cnf
log-bin=mysql-bin
binlog_format=mixed
mysql> start slave;
mysql> show slave status\G
Slave_IO_Running: Yes
log-bin=mysql-bin
binlog_format=mixed
server-id = 10
链接Master和Slave:
将slave指向master,让它知道从哪里进行复制。只需知道主服务器的主机名,端口号,赋予相应权限的用户和用户密码:
mysql> change master to master_host='10.0.8.29',master_user='repuser',master_password='aixocm',master_log_file='mysql-bin.000004',master_log_pos=340; //此配置中的log_file和log_pos可以在master上利用show master status查看到。
将slave指向master,让它知道从哪里进行复制。只需知道主服务器的主机名,端口号,赋予相应权限的用户和用户密码:
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes //如果有这两个状态,则说明配置成功。
至此,已经建立了master和slave之间的复制关系。在主数据库中增删改数据库内容,然后在slave中查看是否复制过来。
已有数据的主从复制
(1)锁定主数据库的表
mysql> flush tables with read lock;
(2)导出数据库
# ./mysqldump -u root --opt --all-databases > mysql.sql
(3)从服务器导入数据库
# mysql -u root < /usr/src/mysql.sql
(4)从服务器设定主服务器的相关参数
mysql> change master to master_host='10.0.8.29',master_user='repuser',master_password='aixocm',master_log_file='mysql-bin.000005',master_log_pos=2447;
mysql> start slave;
mysql> show slave status\G
(5)解锁主服务器
mysql> unlock tables;
已有数据直接从服务器进行复制操作
(1)主数据库配置文件配置
# vim my.cnf
binlog-do-db = dear
binlog-ignore-db = mysql
(2)从服务器配置
# vim my.cnf
binlog-do-db = dear
binlog-ignore-db = mysql
relay_log = mysqld-relay-log
read_only = 1
已有数据的主从复制
(1)锁定主数据库的表
mysql> flush tables with read lock;
(2)导出数据库
# ./mysqldump -u root --opt --all-databases > mysql.sql
(3)从服务器导入数据库
# mysql -u root < /usr/src/mysql.sql
(4)从服务器设定主服务器的相关参数
mysql> change master to master_host='10.0.8.29',master_user='repuser',master_password='aixocm',master_log_file='mysql-bin.000005',master_log_pos=2447;
mysql> start slave;
mysql> show slave status\G
(5)解锁主服务器
mysql> unlock tables;
已有数据直接从服务器进行复制操作
(1)主数据库配置文件配置
# vim my.cnf
binlog-do-db = dear
binlog-ignore-db = mysql
(2)从服务器配置
# vim my.cnf
binlog-do-db = dear
binlog-ignore-db = mysql
relay_log = mysqld-relay-log
read_only = 1
mysql> change master to master_host='10.0.8.29',master_user='repuser',master_password='aixocm',master_log_file='mysql-bin.000001',master_log_pos=0;
二进制日志的操作
(1)查看二进制日志
# mysqlbinlog mysql-bin.000005
# mysqlbinlog --start-datetime="2013-11-20 14:30:00" mysql-bin.000006
# mysqlbinlog --stop-datetime="2013-11-20 14:30:00" mysql-bin.000006
# mysqlbinlog --start-postion=1000 mysql-bin.000007
# mysqlbinlog --stop-postion=1000 mysql-bin.000007
mysql> show binlog events in 'mysql-bin.000016';
(2)删除二进制日志
mysql>reset master; \\清除所有日志
mysql>purge master logs to 'mysql-bin.000004'; \\删除指定编号之前的所有日志
mysql>purge master logs before '2013-11-20 00:00:00"; \\删除指定时间之前的日志
# vim my.cnf
--expire_log_days = 90
(3)使用二进制日志恢复数据库
# mysqlbinlog --stop-postion=800 mysql-bin.000009 | mysql -u root -p
二进制日志的操作
(1)查看二进制日志
# mysqlbinlog mysql-bin.000005
# mysqlbinlog --start-datetime="2013-11-20 14:30:00" mysql-bin.000006
# mysqlbinlog --stop-datetime="2013-11-20 14:30:00" mysql-bin.000006
# mysqlbinlog --start-postion=1000 mysql-bin.000007
# mysqlbinlog --stop-postion=1000 mysql-bin.000007
mysql> show binlog events in 'mysql-bin.000016';
(2)删除二进制日志
mysql>reset master; \\清除所有日志
mysql>purge master logs to 'mysql-bin.000004'; \\删除指定编号之前的所有日志
mysql>purge master logs before '2013-11-20 00:00:00"; \\删除指定时间之前的日志
# vim my.cnf
--expire_log_days = 90
(3)使用二进制日志恢复数据库
# mysqlbinlog --stop-postion=800 mysql-bin.000009 | mysql -u root -p