主从复制目的:
mysql服务器稳定性提升,避免单台mysql服务器宕机后影响整个业务,当出现宕机问题后,可以立即可使从机提升为新的主服务器。从而实现sql高可用冗余性。
一、演示环境
os:centos6.5
sql:mariadb-10.0.12
iptables off
selinux disabled
已装组件:
Development tools
Server Platform Development
主机master:10.19.90.197
从机slave:10.19.90.111
二、(注:sql安装不演示,请参考http://ssc4469.blog.51cto.com/6315913/1627739里的mariadbab安装,另外我这里演示的数据库版本一致的)
master服务器配置:
1、停止服务
# /etc/init.d/mysqld stop
2、修改mysql配置文件,/etc/my.cnf,我这里仅修改了两项参数,如图所示,一个是mysql日志路径,一个是server-id为1
3、创建binlog目录,修改属组
# mkdir -pv /mydata/binlogs/ # chown -R mysql:mysql /mydata/binlogs/
4、启动mysql服务,查看启动信息
# /etc/init.d/mysqld start
5、登录mysql 授权远程用户
MariaDB [(none)]> grant replication slave,replication client on *.* to ‘用户‘@‘10.19.90.111‘ identified by ‘密码‘; //注:用户密码必须是当前sql已创建的用户及密码 MariaDB [(none)]> flush privileges; //刷新MySQL的系统权限相关表
slave服务器配置:
1、停止服务
# /etc/init.d/mysqld stop
2、修改mysql配置文件,/etc/my.cnf,我这里仅修改了两项参数,如图所示,一个是启用mysql中继日志路径,一个是server-id为2
3、创建binlog目录,修改属组
# mkdir -pv /mydata/binlogs/ # chown -R mysql:mysql /mydata/binlogs/
4、启动mysql服务,查看启动信息
# /etc/init.d/mysqld start
5、连接mysql,查看中继日志状态:
(注:中继日志:它其实跟复制相关的,与二进制日志几乎相同,只不过它不是用于记录事件的,而是作为读取数据的源并且在本地执行的,当然中继日志是在从服务器上)
6、查看验证(此时没有文件)
# ls /mydata/relaylogs
7、登录mysql 授权远程用户
MariaDB [(none)]> grant replication slave,replication client on *.* to ‘用户‘@‘10.19.90.197‘ identified by ‘密码‘; //注:用户密码必须是当前sql已创建的用户及密码 MariaDB [(none)]> flush privileges; //刷新MySQL的系统权限相关表
三、查看master、slave节点状态及启用slave节点
2、maser查看日志状态:
3、slave节点查看同步状态(注:配图是已经同步中的状态,实际刚创建完毕,Slave_IO_Running: No,Slave_SQL_Running: No,主要就是看这两项参数)
注:show slave status 解释 MariaDB [(none)]> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.19.90.197 Master_User: root Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000002 Read_Master_Log_Pos: 609 Relay_Log_File: relay-bin.000006 Relay_Log_Pos: 818 Relay_Master_Log_File: master-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: SHOW SLAVE STATUS会返回以下字段: Slave_IO_State SHOW PROCESSLIST输出的State字段的拷贝。SHOW PROCESSLIST用于从属I/O线程。如果线程正在试图连接到主服务器,正在等待来自主服务器的时间或正在连接到主服务器等,本语句会通知您 Master_User 被用于连接主服务器的当前用户。 Master_Port 当前的主服务器接口。 Connect_Retry –master-connect-retry选项的当前值 Master_Log_File I/O线程当前正在读取的主服务器二进制日志文件的名称。 Read_Master_Log_Pos 在当前的主服务器二进制日志中,I/O线程已经读取的位置。 Relay_Log_File SQL线程当前正在读取和执行的中继日志文件的名称。 Relay_Log_Pos 在当前的中继日志中,SQL线程已读取和执行的位置。 Relay_Master_Log_File 由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称。 Slave_IO_Running I/O线程是否被启动并成功地连接到主服务器上。 Slave_SQL_Running SQL线程是否被启动。 Replicate_Do_DB,Replicate_Ignore_DB 使用–replicate-do-db和–replicate-ignore-db选项指定的数据库清单。 Replicate_Do_Table,Replicate_Ignore_Table,Replicate_Wild_Do_Table,Replicate_Wild_Ignore_Table 使用–replicate-do-table,–replicate-ignore-table,–replicate-wild-do-table和–replicate-wild-ignore_table选项指定的表清单。 Last_Errno,Last_Error 被多数最近被执行的查询返回的错误数量和错误消息。错误数量为0并且消息为空字符串意味着“没有错误”。如果Last_Error值不是空值,它也会在从属服务器的错误日志中作为消息显示。 更多相关请参考:http://zhumeng8337797.blog.163.com/blog/static/10076891420115732244591/ 或自行google,关键词:“show slave status”
4、启动slave同步连接服务:
MariaDB [(none)]> start slave -> ; Query OK, 0 rows affected, 1 warning (0.00 sec)
5、slave节点验证文件查看:
6、slave节点同步状态查看:
四、master创建库,测试slave是否同步,这几步操作不在进行演示,大家自己去试试就OK,很简单、
五、我这里讲下,mysql主从同步,如何同步已有的数据。
问题:原本197这台服务器最开始是单项sql服务器,刚才创建的主从同步,不能同步之前的库和数据,下面我给大家讲下这个问题。
解决方法:
主机开两个shell窗口,一个进入mysql,一个是shell
1、master 主机阻断写操作
MariaDB [(none)]> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (0.00 sec)
MariaDB [zentao]> show master status; +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | master-bin.000002 | 2040 | | | +-------------------+----------+--------------+------------------+
2、另一个shell导出master主机相应的数据库
mysqldump -u root -p --opt -R zentao > /opt/zento-0412.sql
3、解锁刚才的锁定
MariaDB [(none)]> UNLOCK TABLES;
4、同步导出的数据
scp /opt/zentao-0412.sql [email protected]:/opt/
5、slave主机
停止slave
MariaDB [(none)]> stop slave; Query OK, 0 rows affected (0.03 sec)
6、创建mysql库
create database zentao;
7、导入数据
mysql -uroot -p‘密码‘ zentao < /opt/zentao-0412.sql
8、从启slave
MariaDB [(none)]> reset slave; Query OK, 0 rows affected (0.00 sec)
六、验证
登录:master数据库连接的web端,后台创建一个新用户,如下:
登录master数据库查看 user表 是否有数据写入;
登录slave数据库查看对应的表是否有数据同步过来;
我这里已同步了 ,懒得写了,累死我了。。。。。。
特别注意注意:估计有人创建后同步数据库时,比如主库创建一条数据同步没事,但是修改一条数据无法同步,重启slave 在show slave status,会看到Last_SQL_Error:1062 报错 ,这里请修改从库的my.cof配置文件,在里面加上
slave-skip-errors = 1062 、在查看,数据就同步过来了,去掉配置里的slave-skip-errors = 1062,重启数据库,在更新主库表,在查看从库对应的数据,一切正常。OK,就这样。麻痹累死我了。。。。。。。
ps:高可用脚本过两天写出来放上