MySQL配置主主及主从备份

摘要:
MySQL主从备份配置实例场景:1。主服务器192.168.0.225、从服务器192.168.0.226。replicate_wid_do_table=测试。%#仅同步测试库下的表relay_Log=mysqld-relay-bin#记录relay-Log Log save updates=YES#从服务器同步后修改日志后重新启动mysql服务。MySQL主备份配置实例在主从备份配置的基础上实现了双主备份:1。在从属服务器上创建同步帐户:˃grant 2、修改主服务器mysql.cnf并添加replicate_wid_do_table=test。%relay_Log=mysqld relay binlog lave updates=YES III.记录从属服务器的二进制日志文件名和位置:˃showmasterstatusG IV.启用主服务器的同步设置:˃changemaster_host='92.168.0.226',master_user='ser-name',master _password='haii',mast_Log_file='mysql-bin.000009',maser_Log_pos=107;然后重新启动mysqld服务。

MySQL主从备份配置实例

场景:

1、主服务器192.168.0.225、从服务器192.168.0.226。其中,主服务器上已有数据。

2、主从服务器上的mysql版本及安装配置相同。

一、主从备份的原理:

主服务器数据库的每次操作都会记录在二进制日志文件mysql-bin.xxx中。从服务器的I/O线程使用专用帐号登陆到主服务器中读取该二进制文件,并将文件内容写入到自己本地的中继日志relay-log文件中。然后从服务器的SQL线程会根据中继日志中的内容执行SQL语句。

这要求两台服务器有同样的初态。

二、同步初态:

1、将主服务器要同步的数据库加锁,避免同步时发生改变:

>use database_name;
>flush tables with read lock;

2、使用mysqldump工具导出数据:

mysqldump -uroot -pxxx database_name >database_name.sql

3、备份完成后,解锁数据库:

>unlock tables;

4、将初始数据导入从数据库:

>create database database_name;
>use database_name;
>source database_name.sql;

 完成以上操作后,主从服务器就有一样的初态了。

三、主从同步设置:

1、配置从数据库:

/etc/my.cnf主要配置如下:

log-bin=mysql-bin                                 #开启二进制日志
    

server-id       = 2                               #主数据库id为1,不能相同。
replicate_wild_do_table=test.%                    #只同步test库下的表
relay_log=mysqld-relay-bin                        #记录中继日志
log-slave-updates=YES                             #从服务器同步后记录日志

修改完成后重启mysql服务。

2、查看主服务器日记记录位置:

>show master statusG

显示内容如下:

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

3、主服务器创建允许从服务器同步数据的账户:

>grant replication slave on *.* to 'user_name'@'192.168.0.226' identified by 'ahaii';

4、从服务器开启同步:

>change master to     
              master_host='192.168.0.225',               
              master_user='user_name',    
              master_password='ahaii',   
              master_log_file='mysql-bin.000001',    
              master_log_pos=80647293;

配置完以上后,重启从服务器mysql服务。

5、查看从服务器是否已经成功开启同步:

>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: mysql-bin.000001
          Read_Master_Log_Pos: 1114
               Relay_Log_File: mysqld-relay-bin.000004
                Relay_Log_Pos: 1260
        Relay_Master_Log_File: mysql-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库下创建表开测试同步了。

 MySQL主主备份配置实例

在主从备份配置完毕的基础上实现双主备份:

一、在从服务器上创建用于同步的帐号:

>grant ...

二、修改主服务器mysql.cnf,加入

replicate_wild_do_table=test.%
relay_log=mysqld-relay-bin
log-slave-updates=YES

三、记录从服务器二进制日志文件名与位置:

>show master statusG

四、主服务器开启同步设置:

>change master to     
        master_host='192.168.0.226',     
        master_user='user_name',    
        master_password='ahaii',    
        master_log_file='mysql-bin.000009',    
        master_log_pos=107;                

然后重启mysqld服务。

以上就是mysql主从、主主设置的过程。

===================

四、疑惑记录:

1、关于my.cnf配置文件中binlog-format的值:

mysql的binlog-format有三种格式,分别是:row、statement和mixed

  1.1、row:基于行的复制(row-based replicate,RBP)

  优点:

  binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题

  缺点:

  所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如一条update语句,修改多条记录,则binlog中每一条修改都会有记录,这样造成binlog日志量会很大,特别是当执行alter table之类的语句的时候,由于表结构修改,每条记录都发生改变,那么该表每一条记录都会记录到日志中。

  1.2、statement:基于SQL语句的复制(statement-based replicate, SBR)

  每一条会修改数据库的SQL语句都会被记录在binlog中。

  优点:

  不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。(相比row能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,其所产生的日志量会增加多少,以及带来的IO性能问题。)

  缺点:

  由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同 的结果。另外mysql 的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题(如sleep()函数, last_insert_id(),以及user-defined functions(udf)会出现问题).

  使用以下函数的语句也无法被复制:

  * LOAD_FILE()

  * UUID()

  * USER()

  * FOUND_ROWS()

  * SYSDATE() (除非启动时启用了 --sysdate-is-now 选项)

  同时在INSERT ...SELECT 会产生比 RBR 更多的行级锁。

  1.3、mixed:混合模式复制(mixed-based replicate,MBR)

  mysql的默认模式。

  mixed模式是以上两种模式的混合使用,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种.新版本的MySQL中队row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录。至于update或者delete等修改数据的语句,还是会记录所有行的变更。

2、关于复制参数:replicate-do-db、replicate-do-table、replicate-wild-do-table

MySQL官网的介绍:https://dev.mysql.com/doc/refman/5.5/en/replication-options-slave.html

  2.1、replicate-do-db:在从服务器上设置需要同步的数据库,要同步多个库时可以写多行,每行一个。

  缺点:不适用于跨库数据更新的复制。

  2.2、replicate-do-table:在从服务器上设置需要同步的表,格式为db_name.tb_name。每行一个,同步多个表时需要写多行。

  缺点:不适用于跨库数据更新的复制。

  2.3、replicate-wild-do-table:在从服务器上设置需要同步的数据库,格式为db_name.tb_name。每行一个,同步多个表时需要写多行。可使用通配符如"%"、"_",来匹配多个表,如同步所有以share字符串开头的数据库的所有use字符串开头的表 :replicate-wild-do-db=share%.user%。

  支持跨库数据更新的复制。

免责声明:文章转载自《MySQL配置主主及主从备份》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在码云上添加公钥时提示不允许重复添加(实际上当前公钥数为0)springboot中json转换LocalDateTime失败的bug解决过程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【转】宽字节注入详解

前言在mysql中,用于转义的函数有addslashes,mysql_real_escape_string,mysql_escape_string等,还有一种情况是magic_quote_gpc,不过高版本的PHP将去除这个特性。 首先,宽字节注入与HTML页面编码是无关的,笔者曾经看到 <meta charset=utf8>...

tp5 使用SMproxy连接池来连接mysql数据库

前言:之前面试的时候被问到tp5-mysql连接池的问题,一下就蒙了,不知道啥玩意,今天有时间特意百度了一下。 PHP连接池的设计初衷是PHP 没有连接池,所以高并发时数据库会出现连接打满的情况,Mycat 等数据库中间件会出现部分 SQL 无法使用,例如不支持批量添加等,而且过于臃肿。 smproxy的原理是将数据库连接作为对象存储在内存中,当用户需要访...

MySQL3:索引

什么是索引 索引是对数据库表中一列或者多列的值进行排序的一种结构,所引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间越多,如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜索数据文件,而不必查看所有数据。 索引的含义和特点 索引是一个单独的、存储在磁盘上的...

分享我们项目中基于EF事务机制的架构

分享我们项目中基于EF事务机制的架构写在前面: 1. 本文中单元测试用到的数据库,在执行测试之前,会被清空,即使用空数据库。 2. 本文中的单元测试都是正确通过的。 要理解EF的事务机制,首先要理解这2个类:TransactionScope和DbContext。 DbContext是我们的数据库,通常我们会建一个类MyProjectDbContext继承自...

Jmeter JDBC连接

1.jmeter连接数据库,首先在测试计划下面添加数据库对应的连接驱动 2.之后创建线程组,在新建的线程组下创建 JDBC Connection Configuration 3.配置JDBC Connection Configuration信息 JDBC的配置解析   1)ORACLE       URL链接: jdbc:oracle:thin:@ho...

oracle11g 连接问题

一、TheNetworkAdaptercouldnotestablishtheconnection 状态:失败-测试失败:IO错误:TheNetworkAdaptercouldnotestablishtheconnection 解决: (①、检查防火墙,可能是端口号1521防火墙拦截,把1521加入可允许访问即可。) 这个异常的出现一般与数据库和你的PC...