MySQL 复制详解及简单实例

所属分类: 数据库 / Mysql 阅读数: 717
收藏 0 赞 0 分享

MySQL 复制详解及简单实例

 主从复制技术在MySQL中被广泛使用,主要用于同步一台服务器上的数据至多台从服务器,可以用于实现负载均衡,高可用和故障切换,以及提供备份等等。MySQL支持多种不同的复制技术,诸如单向,半同步异步复制等以及不同级别的复制,诸如数据库级别,表级,跨库同步等等。本文简要描述了一个基本的主从复制并给出示例。 

1、复制的基本原理(步骤)

    a、在主库上把数据更改记录的二进制日志(binary log)
    b、从库上的I/O线程连接到主库并请求发送其二进制日志文件(主库上的binlog dump线程将二进制日志内容发送到从库)
    c、从库上的I/O线程读取主服务发送的二进制内容并将其拷贝到中继日志
    d、从库上的SQL线程读取中继日志并执行日志中包含的更新 

2、为配置文件添加复制项

# 本文的演示基于同一服务器上的多实例环境,其中3406端口用作主库,而3506用作从库。 
# 关于多实例的部署可参考: 
# MySQL多实例配置(一) http://blog.csdn.net/leshami/article/details/40339167 
# MySQL多实例配置(二) http://blog.csdn.net/leshami/article/details/40339295 
# 3406与3506为都为新装且含缺省库等,所以本文演示中未涉及先迁移主库数据到备库步骤 
a、主库上的配置文件 
# more my3406.cnf  
[mysqld] 
socket = /tmp/mysql3406.sock 
port = 3406 
pid-file = /data/inst3406/data3406/my3406.pid 
user = mysql 
log-error=/data/inst3406/data3406/inst3406.err 
datadir=/data/inst3406/data3406 
basedir=/app/soft/mysql5 
 
#### for master items #### 
server-id=3406 
log_bin=/data/inst3406/log/bin/inst3406bin 
innodb_flush_log_at_trx_commit=1 
sync_binlog=1 
 
b、从库上的配置文件 
# more my3506.cnf  
[mysqld] 
socket = /tmp/mysql3506.sock   # Author : Leshami 
port = 3506            # Blog  : <a target="_blank" href="http://blog.csdn.net/leshamipid-file" rel="external nofollow" >http://blog.csdn.net/leshami 
pid-file</a> = /data/inst3506/data3506/my3506.pid 
user = mysql 
log-error=/data/inst3506/data3506/inst3506.err 
datadir=/data/inst3506/data3506 
basedir=/app/soft/mysql5 
 
#### for slave items #### 
server-id=3506 
relay_log=/data/inst3506/log/relay/relay-bin 
read_only=1 

3、创建复制账号

#启动端口为3406的实例并添加账户 
[mysql@app ~]$ mysqld_safe --defaults-file=/data/inst3406/data3406/my3406.cnf & 
[mysql@app ~]$ mysql -P3406  #登陆到3406 
 
master@localhost[(none)]> show variables like 'server_id'; 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| server_id   | 3406 | 
+---------------+-------+ 
 
#创建用于复制的账户 
master@localhost[(none)]> grant replication slave,replication client on *.* 
  -> to repl@'192.168.1.177' identified by 'repl'; 
 
#初始化主库日志文件,生成环境慎用reset 
master@localhost[(none)]> reset master; 
Query OK, 0 rows affected (0.01 sec) 
 
#查看主库的状态,日志初始化至000001, 
master@localhost[(none)]> show master status,Position为120 
+--------------------+----------+--------------+------------------+-------------------+ 
| File        | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | 
+--------------------+----------+--------------+------------------+-------------------+ 
| inst3406bin.000001 |   120 |       |         |          | 
+--------------------+----------+--------------+------------------+-------------------+ 

4、配置主从同步

#启动端口为3506的实例 
[mysql@app ~]$ mysqld_safe --defaults-file=/data/inst3506/data3506/my3506.cnf & 
 
[mysql@app ~]$ msyql -P3506 
 
slave@localhost[(none)]> show variables like 'server_id'; 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| server_id   | 3506 | 
+---------------+-------+ 
1 row in set (0.00 sec) 
 
#为从库添加指向主库的相关配置信息,该命令会生成及修改备库上的master.info及relay-log.info文件 
slave@localhost[(none)]> CHANGE MASTER TO MASTER_HOST='192.168.1.177', 
  -> MASTER_USER='repl', 
  -> MASTER_PASSWORD='repl', 
  -> MASTER_PORT=3406, 
  -> MASTER_LOG_FILE='inst3406bin.000001', 
  -> MASTER_LOG_POS=0; 
Query OK, 0 rows affected, 2 warnings (0.04 sec) 
 
#出现了2个warnings,查看一下 
slave@localhost[(none)]> show warnings \G 
*************************** 1. row *************************** 
 Level: Note 
  Code: 1759 
Message: Sending passwords in plain text without SSL/TLS is extremely insecure. 
*************************** 2. row *************************** 
 Level: Note 
  Code: 1760 
Message: Storing MySQL user name or password information in the master.info repository is not secure and is therefore not recommended.  
Please see the MySQL Manual for more about this issue and possible alternatives. 
2 rows in set (0.00 sec) 
 
#此时查看从库的状态信息 
slave@localhost[(none)]> show slave status \G 
*************************** 1. row *************************** 
        Slave_IO_State:  
         Master_Host: 192.168.1.177 
         Master_User: repl 
         Master_Port: 3406 
        Connect_Retry: 60 
       Master_Log_File: inst3406bin.000001 
     Read_Master_Log_Pos: 4 
        Relay_Log_File: relay-bin.000001 
        Relay_Log_Pos: 4 
    Relay_Master_Log_File: inst3406bin.000001 
       Slave_IO_Running: No   #IO线程没有运行 
      Slave_SQL_Running: No   #SQL线程没有运行 
          ...................... 
       Master_Info_File: /data/inst3506/data3506/master.info 
 
slave@localhost[(none)]> start slave; #启动slave 
Query OK, 0 rows affected (0.01 sec) 
 
#含义如下 
START SLAVE with no thread_type options starts both of the slave threads. The I/O thread reads 
events from the master server and stores them in the relay log. The SQL thread reads events from the 
relay log and executes them. 
 
#再次查看slave的状态 
robin@localhost[(none)]> show slave status\G 
*************************** 1. row *************************** 
        Slave_IO_State: Waiting for master to send event 
         Master_Host: 192.168.1.177 
         Master_User: repl 
         Master_Port: 3406 
        Connect_Retry: 60 
       Master_Log_File: inst3406bin.000001 
     Read_Master_Log_Pos: 120 
        Relay_Log_File: relay-bin.000002 
        Relay_Log_Pos: 285 
    Relay_Master_Log_File: inst3406bin.000001 
       Slave_IO_Running: Yes    #IO线程处于运行状态  
      Slave_SQL_Running: Yes    #SQL线程处于运行状态  
           .............. 
     Exec_Master_Log_Pos: 120 
       Relay_Log_Space: 452 
           ............ 
       Master_Server_Id: 3406 
         Master_UUID: 32f53a0a-63ef-11e4-93d9-8c89a5d108ae 
       Master_Info_File: /data/inst3506/data3506/master.info 
          SQL_Delay: 0 
     SQL_Remaining_Delay: NULL   
   Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it #重要的提示信息 
 
#可以看到从库上的2个线程,一个是用于I/O线程,用于连接到主库请求主库发送binlog,一个是用于执行SQL的SQL线程。 
slave@localhost[(none)]> show processlist\G 
*************************** 1. row *************************** 
   Id: 4 
  User: system user 
  Host:  
   db: NULL 
Command: Connect 
  Time: 510993 
 State: Waiting for master to send event 
  Info: NULL 
*************************** 2. row *************************** 
   Id: 5 
  User: system user 
  Host:  
   db: NULL 
Command: Connect 
  Time: 333943 
 State: Slave has read all relay log; waiting for the slave I/O thread to update it 
  Info: NULL 

5、验证同步情况

#下面在主库上执行一些操作以检查从库的同步情况 
master@localhost[(none)]> show variables like 'server_id'; 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| server_id   | 3406 | 
+---------------+-------+ 
1 row in set (0.00 sec) 
 
#主库上Binlog Dump线程用于发送binlog日志文件到从库,如下查询 
master@localhost[(none)]> show processlist\G 
*************************** 1. row *************************** 
   Id: 12 
  User: repl 
  Host: 192.168.1.177:57440 
   db: NULL 
Command: Binlog Dump 
  Time: 511342 
 State: Master has sent all binlog to slave; waiting for binlog to be updated 
  Info: NULL 
   
#主库创建数据库及表 
master@localhost[(none)]> create database tempdb; 
Query OK, 1 row affected (0.01 sec) 
 
master@localhost[(none)]> use tempdb 
Database changed 
master@localhost[tempdb]> create table tb_engines as select * from information_schema.engines; 
Query OK, 9 rows affected (0.02 sec) 
Records: 9 Duplicates: 0 Warnings: 0 
 
#下面是在从库上检查的结果 
slave@localhost[(none)]> select count(*) from tempdb.tb_engines; 
+----------+ 
| count(*) | 
+----------+ 
|    9 | 
+----------+ 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多精彩内容其他人还在看

mysql多表连接查询实例讲解

本篇文章中给大家通过实例代码讲述了mysql多表连接查询的方法,有需要的朋友们可以参考学习下。
收藏 0 赞 0 分享

MySQL设置global变量和session变量的两种方法详解

这篇文章主要介绍了MySQL设置global变量和session变量的两种方法,每种方法给大家介绍的非常详细 ,需要的朋友可以参考下
收藏 0 赞 0 分享

8种手动和自动备份MySQL数据库的方法

作为流行的开源数据库管理系统,MySQL的使用者众多,为了维护数据安全性,数据备份是必不可少的。本文就为大家介绍几种适用于企业的数据备份方法,需要的朋友可以参考下
收藏 0 赞 0 分享

使用JDBC连接Mysql数据库会出现的问题总结

这篇文章主要给大家介绍了关于使用JDBC连接Mysql数据库会出现的问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Ubuntu中MySQL的参数文件my.cnf示例详析

这篇文章主要给大家介绍了关于Ubuntu中MySQL的参数文件my.cnf的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

解决启动MongoDB错误:error while loading shared libraries: libstdc++.so.6:cannot open shared object file:

本文提供了解启动MongoDB时提示:error while loading shared libraries: libstdc++.so.6: cannot open shared object file: 错误的解决方案
收藏 0 赞 0 分享

PHP定时备份MySQL与mysqldump语法参数详解

本文为大家介绍了PHP利用mysqldump命令定时备份MySQL与mysqldump语法参数大全以及定时备份的PHP实例代码
收藏 0 赞 0 分享

定时备份 Mysql并上传到七牛的方法

常见的 MySQL 数据备份方式有,直接打包复制对应的数据库或表文件(物理备份)、mysqldump 全量逻辑备份、xtrabackup 增量逻辑备份等。这篇文章主要介绍了定时备份 MySQL 并上传到七牛 ,需要的朋友可以参考下
收藏 0 赞 0 分享

MySQL锁(表锁,行锁,共享锁,排它锁,间隙锁)使用详解

本文全面讲解了MySQL中锁包括表锁,行锁,共享锁,排它锁,间隙锁的详细使用方法
收藏 0 赞 0 分享

MySQL中的排序函数field()实例详解

这篇文章主要给大家介绍了关于MySQL中排序函数field()的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享
查看更多