zoukankan      html  css  js  c++  java
  • MySQL主从备份

    本文目录结构:

    1.主从复制

    1.1简介

    1.2实操

    1.3问题处理

    其他:my.cnf主从配置参数

    1.主从复制

    1.1简介

    原理
    主服务器数据库的每次操作都会记录在二进制日志文件mysql-bin.xxx中。从服务器的I/O线程使用专用帐号登陆到主服务器中读取该二进制文件,并将文件内容写入到自己本地的中继日志relay-log文件中。然后从服务器的SQL线程会根据中继日志中的内容执行SQL语句,这要求两台服务器有同样的初态。
    逻辑步骤:
    1)主服务器数据库的每次操作都会记录在二进制日志文件mysql-bin.xxx中.
    2)从库的IO线程向主库的主进程发送请求,主库验证从库,交给主库IO线程负责数据传输
    3)主库IO线程对比从库发送过来的master.info里的信息,将binlog文件信息,偏移量和binlog文件名等发送给从库
    4)从库接收到信息后,将binlog信息保存到relay-bin中,同时更新master.info的偏移量和binlog文件名
    5)从库的SQL线程不断的读取relay-bin的信息,同时将读到的偏移量和文件名写道relay-log.info文件,binlog信息写进自己的数据库,一次同步操作完成。
    6)完成上次同步后,从库IO线程不断的向主库IO线程要binlog信息

    形式:
    一主一从,一主多从,多主一从,主主复制,联级复制。

    用途:
    实时灾备,读写分类,备份。

    条件:
    主库开启binlog日志
    主从server-id不同
    从库可以连到主库

    1.2.实操配置

     1)同步初态

    先将主机数据库加锁,避免数据改变
    >use tatabase_name;
    >flush tables with read lock;
    再将主机数据备份
    mysqldump -uroot -pxxx database_name > database_name.sql
    备份完后解锁数据库
    >unlock tables;
    在从机从机相同的数据库,然后导入数据
    >create table database_name;
    >use database_name;
    >source database_name.sql;

    2)主机打开二进制日志

    在/etc/my.cnf主要配置如下内容:
    log-bin=my-bin #开启二进制日志
    server-id=1 #设置为主库,server-id值为1

    修改后重启mysql服务

    3)查看主机日志记录状态

    >show master statusG

    显示内容格式如下,记住此状态,后面用到

    ***************** 1. row ****************
                File: my-bin.000001       #当前记录的日志
            Position: 553               #日志中记录的位置
        Binlog_Do_DB: 
    Binlog_Ignore_DB: 
    1 row in set (0.00 sec)
    

    4)主机登录mysql创建允许从服务器同步数据的账号

    > grant replication slave on *.* to 'user_name'@'slave_ip' identified by 'pass_word';

    5)配置从机mysql,在从机/my.cnf配置如下内容:

    log-bin=my-bin                             #开启二进制日志
    server-id= 2                               #主数据库id为1,不能相同。
    replicate_wild_do_table=copytest.%         #只同步copytest库下的表,可以不配置此项
    relay_log=mysqld-relay-bin                 #记录中继日志
    log-slave-updates=YES                      #从服务器同步后记录日志

    也可以添加以下两行指定开启日志的库:

    binlog_do_db=db_name1;db_name2 --指定同步的数据库
    binlog_ignore_db=db_name3;db_name4 --指定不同步的数据库
    注意:如果配置binlog_do_db其他库都将被忽略

    修改完后重启mysql

    6)根据前面在主机配置的账号,在从机登录mysql后打开同步功能

    > change master to master_host='master_ip',master_user='user_name',master_password='pass_word',master_log_file='my-bin.000001',master_log_pos=553;

    配置完后从起msyql的slave服务

    > slave start;

    7)查看从服务器是否成功开启同步

    >show slave statusG

    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.0.225
                      Master_User: user_name
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: my-bin.000001
              Read_Master_Log_Pos: 1114
                   Relay_Log_File: mysqld-relay-bin.000004
                    Relay_Log_Pos: 1260
            Relay_Master_Log_File: my-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: test.%
      Replicate_Wild_Ignore_Table: 
                       Last_Errno: 0
                       Last_Error: 
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 1114
                  Relay_Log_Space: 1563
                  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: 
      Replicate_Ignore_Server_Ids: 
                 Master_Server_Id: 1
    1 row in set (0.00 sec)
    

    其中:Slave_IO_Running和Slave_SQL_Running的状态都是YES,说明同步开启成功。
    现在就可以去主服务器上的test库下创建表开测试同步了

    1.3问题处理

    1)主服务器:show master statusG 输出Empty set

    参考博文:https://blog.csdn.net/lanyang123456/article/details/85221071

    原因:MySQL没有开启日志,可以登录MySQL如下查看

    mysql> show variables like '%log_bin%';
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | log_bin                         | OFF   |
    | log_bin_basename                |       |
    | log_bin_index                   |       |
    | log_bin_trust_function_creators | OFF   |
    | log_bin_use_v1_row_events       | OFF   |
    | sql_log_bin                     | ON    |
    +---------------------------------+-------+
    6 rows in set (0.00 sec)

     可以看到log_bin为关闭状态,在mysql 配置文件 /etc/my.cnf中

    [mysqld]下添加:

    log-bin=my-bin

    然后重启MySQL,再次查看master状态:

    mysql> SHOW MASTER STATUSG
    *************************** 1. row ***************************
                 File: my-bin.000001
             Position: 245
         Binlog_Do_DB: 
     Binlog_Ignore_DB: 
    1 row in set (0.00 sec)

     log-bin配置项表示binlog的base name,产生的日志文件名类似:my-bin.00001,my-bin.00002...

    show master status命令列出了日志位点信息,包括binlog file,binlog position等。

     2)从服务器:show slave statusG 发现Slave_IO_Runing:No

    参考博文:https://blog.csdn.net/xu1314/article/details/7693906
    参考博文:https://www.cnblogs.com/l-hh/p/9922548.html
    注意查看从机 Last_IO_Error,下面原因可能不准,但这儿是保存信息,可以根据这定位

    可能原因:
    a)slave没有访问master的权限,应检查master的权限配置和slaver的登录master账号配置,以及通信。
    b)slave的master日志文件配置与主服务器不一致
    使用show slave statusG 查看从机状态,使用show master statusG 查看主机状态,此时slave的Last_IO_Error提示:
    Coud not find find first log file name in binary log index file --文件名不对
    Misconfigured master -server id was not set --主机的server-id没有配置,要配置且为1,然后从起主机的MySQL和从机的slave
    Client requested master to start replication from impossible position;the... --从机读取主机日志位置超过主机日志最大位置

    本人原因:文件不对和主机server-id未配置,处理如下
    主机配置my.cnf中的server-id,值为1
    主机从起msyql
    停止从机slave:slave stop
    从机修改配置:CHANGE MASTER TO MASTER_LOG_FILE='主机的File', MASTER_LOG_POS=0或比主机的Position小的正数;
    从机启动slave:slave start

    其他1:my.cnf主从配置主要参数

    设置主数据库的参数信息,主要设置字段为server-id,log_bin,binlog_do_db ,其他字段参考参数定义自行设置, 配置文件中相关参数定义如下:

  • 相关阅读:
    平摊分析的应用
    平摊分析--势能法
    平摊分析--会计法
    平摊分析--聚集法
    算法设计与分析总结
    动态规划--前缀动态规划问题
    【例】动态规划--最长回文序列问题
    分治法--中位数与顺序统计量
    动态规划--数轴动态规划问题
    pymssql模块官方文档的翻译
  • 原文地址:https://www.cnblogs.com/ShouWangYiXin/p/11770113.html
Copyright © 2011-2022 走看看