MySQL 复制详解及简单实例
作者:lqh 发布时间:2024-01-15 12:50:28
标签:MySQL,复制
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 |
+----------+
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
来源:http://blog.csdn.net/leshami/article/details/41643013


猜你喜欢
- “一起去爬山吧?”这句台词火爆了整个朋友圈,没错,就是来自最近热门的《隐秘的角落》,豆瓣评分8.9分,好评不断。感觉还是蛮不错的。同时,为了
- 前几天和一个小伙伴交流了一下nodejs中epoll和处理请求的一些知识,今天简单来聊一下nodejs处理请求的逻辑。我们从listen函数
- 前言最近在写 echarts 的时候碰到了这么一个报错,如下图。造成报错的原因是因为 echarts 的图形容器还未生成就对其进行了初始化,
- 说到装饰器,就不得不说python自带的三个装饰器:1、@property 将某函数,做为属性使用@property 修饰,就是将方法,变成
- #-*- coding:utf-8 -*-import osif __name__ == '__main__':
- 一、Set 集合类型Set 集合类型 (交差并补) 特点 :无序 , 自动去重集合用{}表示,元素间用逗号分隔建立集合类型用{}或set()
- 一、问题描述在用python开发时经常用到logging这个包,根据官方示例,如果要指定日志级别可以写成如下的方式。import loggi
- MySQL、SQL Server和mSQL都是绝佳的SQL工具,可惜,在ASP的环境下你却用不着它们来创建实用的SQL语句。不过,你可以利用
- 前言Go语言自带的net/http包提供了HTTP客户端和服务端的实现,实现一个简单的http服务非常容易,其自带了一些列结构和方法来帮助开
- Windows中升级MySQL应采取的步骤:1. 进行升级前你应先备份当前的MySQL安装。2. 下载最新Windows版MySQL。3.
- 先来看一个老掉牙的故事:福特说,我在设计汽车之前,到处去问人们“需要一个什么样的更好的交通工具?”,几乎所有人的答案都是 ── 一匹“更快的
- 有些页面并不能直接用requests获取到内容,会动态执行一些js代码生成内容。这个文章主要是对付那些特殊页面的,比如必须要进行js调用才能
- python实现猫捉老鼠小游戏首界面开始游戏界面然后键盘操作小老鼠上下左右移动,猫自己去追,当猫追上老鼠则游戏结束这里用时3.2秒,最后将游
- 简介:MongoEngine 是一个Document-Object Mapper (想一下ORM, 但它是针对文档型数据库),Python通
- 1.切片# 切片:取list或tuple的部分元素nameList = ["Willard","ChenJD&
- 在使用前必须弄明白JWT的相关知识,可以看我的另一篇博文:https://www.jb51.net/article/166843.htm什么
- python 绘制拟合曲线并加指定点标识import osimport numpy as npfrom scipy import logfr
- 这个东西很重要,可以经常用在项目当中,所以我们单独拿出来进行讲解。在使用它之前我们需要导包: go get golang.org/
- 我就废话不多说了,大家还是直接看代码吧~func ReadLine(fileName string) ([]string,error){f,
- 使用python中的生成器实现周期性发送列表中数值的报文发送功能。功能开发背景:提取cantest工具采集到的现场报文数据,希望使用原始的现