Mysql数据库主从备份基本概念篇

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

(0)
上一篇 2021年8月7日
下一篇 2021年8月7日

相关推荐

发表回复

登录后才能评论