mysql数据库主从备份原理以及思路概念
1. 主服务器验证连接。 2. 主服务器为从服务器开启一个线程。 3. 从服务器将主服务器日志的偏移位告诉主服务器。 4. 主服务器检查该值是否小于当前二进制日志偏移位。 5. 如果小于,则通知从服务器来取数据。 6. 从服务器持续从主服务器取数据,直至取完,这时,从服务器线程进入睡眠,主服务器线程同时进入睡眠。 7. 当主服务器有更新时,主服务器线程被激活,并将二进制日志推送给从服务器,并通知从服务器线程进入工作状态。 8. 从服务器SQL线程执行二进制日志,随后进入睡眠状态。
1、Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容; 2、Master接收到来自Slave的IO进程的请求后,通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置; 3、Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”; 4、Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
本文主要是为了实现mysql主从的备份效果,所以这里mysql就最基本的yum安装。
主服务器安装 [root@tiejiang1 ~]# yum -y install mysql mysql-server mysql-devel //安装mysql数据库必要服务 [root@tiejiang1 ~]# /etc/init.d/mysqld start //启动mysql [root@tiejiang1 ~]# chkconfig mysqld on //设为开机启动 [root@tiejiang1 ~]# cp /usr/share/mysql/my-medium.cnf /etc/my.cnf //拷贝配置文件(注意:如果/etc目录下面默认有一个my.cnf,直接覆盖即可) [root@tiejiang1 ~]# mysql_secure_installation //为root帐户设置密码 回车,根据提示输入"y"。输入2次密码,回车。根据提示一路输入"y" 最后出现"Thanks for using MySQL!" mysql密码设置完成,重新启动mysql [root@tiejiang1 ~]# /etc/init.d/mysqld restart //重启mysql服务
从服务器安装 [root@tiejiang2 ~]# yum -y install mysql mysql-server mysql-devel //安装mysql数据库必要服务 [root@tiejiang2 ~]# /etc/init.d/mysqld start //启动mysql [root@tiejiang2 ~]# chkconfig mysqld on //设为开机启动 [root@tiejiang2 ~]# cp /usr/share/mysql/my-medium.cnf /etc/my.cnf //拷贝配置文件(注意:如果/etc目录下面默认有一个my.cnf,直接覆盖即可) [root@tiejiang2 ~]# mysql_secure_installation //为root帐户设置密码 回车,根据提示输入"y"。输入2次密码,回车。根据提示一路输入"y" 最后出现"Thanks for using MySQL!" mysql密码设置完成,重新启动mysql [root@tiejiang2 ~]# /etc/init.d/mysqld restart //重启mysql服务
一、主从服务器分别以下操作
1. mysql数据库版本最好一致 2. 初始化表,并在后台启动mysql 3. 修改root密码
二、修改主服务器master
[root@tiejiang1 ~]# vim /etc/my.cnf log-bin=mysql-bin //必须启用二进制日志 server-id = 7 //服务器唯一ID,默认是1,一般取IP最后一段
三、修改从服务器slave
[root@tiejiang2 ~]# vim /etc/my.cnf log-bin=mysql-bin //必须启用二进制日志 server-id = 22 //服务器唯一ID,默认是1,一般取IP最后一段
四、重启两台服务器的mysql
[root@tiejiang1 ~]# service mysqld restart //主服务器 [root@tiejiang2 ~]# service mysqld restart //从服务器
五、在主服务器上建立帐户并授权slave
[root@tiejiang1 ~]# mysql -uroot -pyuanfei123 mysql> GRANT REPLICATION SLAVE ON *.* to '163ns'@'%' identified by '123456'; ////一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.163.22,加强安全。
六、登录主服务器的mysql,查询master的状态
[root@tiejiang2 ~]# mysql -uroot -pyuanfei321 mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000002 | 249 | | | +------------------+----------+--------------+------------------+ 注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化。
七、配置从服务器Slave
[root@tiejiang2 ~]# mysql -uroot -pyuanfei321 mysql> change master to master_host='192.168.163.7',master_user='163ns',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=249; //注意不要断开,249数字前后无单引号。 mysql> start slave; //启动从服务器复制功能
八、检查从服务器复制功能状态
[root@tiejiang2 ~]# mysql -uroot -pyuanfei321 mysql> show slave status/G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.163.7 //主服务器地址 Master_User: 163ns //授权帐户名,尽量避免使用root Master_Port: 3306 //数据库端口,部分版本没有此行 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 249 //同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos Relay_Log_File: mysqld-relay-bin.000002 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes //此状态必须YES Slave_SQL_Running: Yes //此状态必须YES ...............................
注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。
以上操作过程,主从服务器配置完成。
九、主从服务器测试
主服务器Mysql,建立数据库,并在这个库中建表插入一条数据
[root@tiejiang1 ~]# mysql -uroot -pyuanfei123 mysql> create database hi_db; Query OK, 1 row affected (0.00 sec) mysql> use hi_db; Database changed mysql> create table hi_tb(id int(3),name char(10)); Query OK, 0 rows affected (0.00 sec) mysql> insert into hi_tb values(001,'bobu'); Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | hi_db | | mysql | | test | +--------------------+ 4 rows in set (0.00 sec)
从服务器Mysql查询
[root@tiejiang2 ~]# mysql -uroot -pyuanfei321 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | hi_db | //I'M here,大家看到了吧 | mysql | | test | +--------------------+ 4 rows in set (0.00 sec) mysql> use hi_db Database changed mysql> select * from hi_tb; //查看主服务器上新增的具体数据 +------+------+ | id | name | +------+------+ | 1 | bobu | +------+------+ 1 row in set (0.00 sec)
10、完成:
编写一shell脚本,用nagios监控slave的两个yes(Slave_IO及Slave_SQL进程),如发现只有一个或零个yes,就表明主从有问题了,发短信警报吧。
#!/bin/bash port=`netstat -anl|grep 3306 |sed -n '1p' |awk '{print $4}'|awk -F: '{ print $2}'` array=($(mysql -uroot -p123 -e "show slave status/G"|grep "Running" |awk '{print $2}')) if ["$port" == "3306"] then if [ "${array[0]}" == "Yes" ] || [ "${array[1]}" == "Yes" ] then echo "slave is OK" else echo "slave is error" fi fi
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/55237.html