【配置mysql复制环境】(一)基于bin-log的配置方式

基于mysql5.7

复制就是把一台MySQL服务(Master)上的数据拷贝到另外一台或几台MySQL服务器(slaves)上。复制默认是异步进行的 。 根据配置,可以复制MySQL 服务上的全部数据库、指定的数据库或是一个数据库中指定的几个表。

复制的好处:

  • 一个横向扩展的方案: 读写分离
  • 数据安全: salves 可以将复制处理挂起后做备份而不影响master
  • 分析: 在线数据处理放在master上; 分析统计处理放到slaves上,不影响master的性能。
  • 异地数据分布

复制的方式

  • bin-log: 传统的方式
  • GTIDs: 新方式

复制类型

  • oneway asynchronous replication
  • synchronous repalication

复制方式

  • 基于语句的复制 Statement Based Replication (SBR)
  • 基于行的复制 Row Based Replication (RBR)
  • 混合方式 Mixed Base Replication (MRB)

16.1 复制的配置

16.1.1 基于bin-log配置的概要

主库将更新事件写入bin-log。
从库读取主库的bin-log, 并执行bin-log的中的事件。
每个从库会获取完整的bin-log。 从库默认是执行bin-log中所有的事件。
但可以配置只执行特定数据库或特定数据表的事件。
不能说配置只执行某一个事件。

bin-log的坐标: 文件名和文件内的位置。

每一个主库和从库都要配置一个唯一的 server-id。
从库上要配置主库的host name 和 bin-log 文件名、位置。

server-id: a unique ID which the master and each slave must be configured.
slave statement : "CHANGE MASTER TO"

16.1.2 基于bin-log 的复制配置

一般步骤

  • 在主库上打开bin-log,并配置唯一的server-id。 需要重启服务
  • 为每个从库配置唯一的server-id。 需要重启服务
  • 创建一个复制作业专用的的用户(可选)
  • 创建数据快照前或启动复制处理前,需要记下主库的bin-log 坐标, 用来配置从库。
  • 主库如果已经有了数据,需要将既有数据通过数据快照先拷贝到所有的从库上。 根据存储引擎的不同, 数据快照的方式也不同。 对于MyISAM ,需要停下所有的处理获取一个读锁,然后获取bin-log坐标并导出数据。如果这个过程种数据有更新,会造成数据快照与主库信息不匹配,最终得到的从库数据也是不正确的。 (如果是InnoDB, 则不需要加读锁, 事务可以充分保证数据快照的生成了)?。
  • 配置从库连接主库:主库连接, 用户名密码, bin-log坐标

16.1.2.1 主库配置

关闭MySQL 服务并修改 my.cnf 或 my.ini 文件。
在[mysqld] 下面添加log-bin 和 server-id配置
server-id 的取值范围 [1 , (2的32次方)−1]

[mysqld]
log-bin=mysql-bin
server-id=1

注意:

  • 没有配置server-id 的话, 主库会拒绝所有的从库连接请求
  • 为了保证持久性和一致性, 使用InnoDB时要在主库的my.cnf文件中配置 innodb_flush_log_at_trx_commit=1 和 sync_binlog=1 in the master my.cnf file
  • 确保主库没有打开skip-networking 配置, 否则从库连不上主库

16.1.2.2 创建复制用户

mysql> CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';

16.1.2.3 获取bin-log坐标

第一步: 打开一个客户端session 执行 【FLUSH TABLES WITH READ LOCK】 并保持客户端session一直打开

mysql> FLUSH TABLES WITH READ LOCK;

第二步: 再打开一个客户端session 执行 【SHOW MASTER STATUS】

mysql > SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 73       | test         | manual,mysql     |
+------------------+----------+--------------+------------------+

如果之前没有打开bin-log, 这里得到的file 和 position 都是空的, 这时从库配置filename 和 position 为 空字符串 ('') 和 4。

16.1.2.4 生成数据快照

主库如果已经数据,需要将主库数据复制到每一个从库上。

  • mysqldump:推荐, 尤其是InnoDB
  • 复制数据文件: 更快速。 InnoDB不建议这么做

mysqldump

shell on master> mysqldump --all-databases --master-data > dbdump.db

--master-data: 配置会自动添加一个 CHANGE MASTER TO 语句, 这样从库就可以不用配置bin-log坐标了。

--all-databases: 所有的数据库
--ignore-table: 排除指定的表
--databases : 指定数据库

16.1.2.5 配置从库

前提:

  • 主库已经配置好
  • bin-log 坐标,数据快照OK
  • 主库的读锁已经释放
    • mysql> UNLOCK TABLES;

在配置文件 [mysqld] 下配置:
[mysqld] server-id=2
一定要配置,不能和其它mysql服务冲突,否则连不上。
从库不需要配置bin-log。 也可以配置bin-log,将这个从库当作其它mysql的主库。

没有既有数据需要导入:

  • 重启服务
  • 连接主库
    mysql> CHANGE MASTER TO
    ->     MASTER_HOST='master_host_name',
    ->     MASTER_USER='replication_user_name',
    ->     MASTER_PASSWORD='replication_password',
    ->     MASTER_LOG_FILE='recorded_log_file_name',
    ->     MASTER_LOG_POS=recorded_log_position;

如果有既有数据需要导入:

  1. 启动从库时带上 --skip-slave-start 参数, 不启动复制处理
  2. 导入dump文件(通过上面的配置导出的dump文件带有 CHANGE MASTER TO,后面就不用执行了 )

shell> mysql < fulldb.dump

16.1.2.6 复制环境中添加从库

我们可以在不影响主库的情况下向复制环境中添加一个新的从库。 直接拷贝现存从库的数据文件夹到新从库,并配置一个不同的 server-id (用户配置) 和 一个 server UUID (启动时生成)。

  1. 关闭现存从库复制处理, 并记录复制状态。
mysql> STOP SLAVE;
mysql> SHOW SLAVE STATUS\G
  1. 关闭现存从库
shell> mysqladmin shutdown
  1. 将所有的数据文件从老的从库上拷贝到新从库,
  2. 拷贝完成后,将新从库数据文件中的 auto.cnf删除(重启后自动生成 server UUID)。
  3. 重启现存从库
  4. 为新的从库配置一个 server-id(唯一)
  5. 启动新从库,带上 --skip-slave-start 参数。
  6. 使用 【SHOW SLAVE STATUS 】 确认复制状态和之前记录的 源从库一致
  7. 确认 server-id 和 server UUID 没有冲突
  8. 【START SLAVE】
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容