AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 239639
Accepted
GuruBob
GuruBob
Asked: 2019-06-02 17:31:07 +0800 CST2019-06-02 17:31:07 +0800 CST 2019-06-02 17:31:07 +0800 CST

使用 percona 和 docker 的 MySQL 复制从站

  • 772

我正在尝试在 docker 容器中运行 MySQL 复制从属。我们在生产环境中运行 MySQL 5.7.24-27-log,它来自 percona 存储库(Ubuntu 18.04)。

我曾经xtrabackup备份、准备和发送一个用于复制的起始数据集,然后我docker pull percona像这样启动了 percona docker 映像():

$ docker run --name mysql-replication -v /replication/data:/var/lib/mysql -v /replication/docker.cnf:/etc/mysql/docker.cnf:ro -e MYSQL_ROOT_PASSWORD=xxxx -P -d percona

我的 docker.cnf 只记录了服务器 ID(我从percona图像中复制了它)。

[mysqld]
skip-host-cache
skip-name-resolve
bind-address    = 0.0.0.0
server-id       = 4

然后使用CHANGE MASTER等。我的复制运行得很好。

我的意图(根据卷挂载-v /replication/data:/var/lib/mysql)是将所有 MySQL 数据保留在主机上,并将复制 docker 容器视为短暂的,即容器中没有状态。server-id如果我需要通过停止现有容器、将数据复制到别处、更改并运行新容器来启动另一个复制容器,也应该很容易。

为了测试这一点,在它设置并正常运行后(我看了Seconds_Behind_Master下拉到0),我想我应该能够删除容器并重新创建它,并且复制仍然可以正常工作。因此我尝试了这个:

$ docker stop mysql-replication
$ docker rm mysql-replication
$ docker run ... // same command as before

当我这样做并连接到在容器中运行的 MySQL 时,我发现它Slave_IO_Running是No,并且在启动它 ( START SLAVE;) 后,我得到以下信息(如中所示SHOW SLAVE STATUS;):

Last_Error: Could not execute Update_rows event on table databasename.tablename; Can't find record in 'tablename', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000681, end_log_pos 9952

(databasename并且tablename是真实的数据库和表名)

起初我以为我可能搞砸了,但我现在已经尝试了很多次来尝试解决问题。使用docker diff mysql-replication显示对正在运行的容器没有任何变化,这似乎很重要:

$ docker diff mysql-replication 
C /run
C /run/mysqld
A /run/mysqld/mysqld.pid
C /var
C /var/log
A /var/log/mysql

谷歌搜索建议我需要使用RESET SLAVE;,START SLAVE;但这似乎无法解决它 - 就像数据(容器外)不再与主服务器同步,因此复制无法继续。

任何人都可以在我正在做的事情中找出漏洞吗?

非常感谢。

replication percona
  • 1 1 个回答
  • 565 Views

1 个回答

  • Voted
  1. Best Answer
    GuruBob
    2019-06-13T03:57:36+08:002019-06-13T03:57:36+08:00

    此问题的根本原因是文件中缺少该relay-log选项mysql.cnf(或者在这种情况下,由于 docker 卷挂载,该docker.cnf文件)。这导致文件的创建和使用,例如89726507f176-relay-bin.000002最初,89726507f176机器的主机名在哪里(在创建映像时由 docker 守护程序随机分配)。当容器停止、移除和重新创建时,会创建和使用一组新文件(例如be0c801d95bc-relay-bin.000407),但这会导致同步问题。

    relay-log通过在文件中明确指定一个值,docker.cnf可以毫无问题地删除和重新创建容器。

    作为旁注,我还建议 /var/log/mysql 目录没有被挂载存在问题 - 事实并非如此。但是,如果您指定了一个值,log_bin = /var/log/mysql/mysql-bin.log例如,那么这是一个要求。如果您不指定此路径,则二进制日志似乎存储在本地 /var/lib/mysql 中,该 /var/lib/mysql 已安装在容器外部。

    我的最终docker.cnf文件如下:

    [mysqld]
    skip-host-cache
    skip-name-resolve
    bind-address        = 0.0.0.0
    
    binlog-ignore-db = mysql
    replicate-ignore-db = mysql
    
    log_bin = /var/log/mysql/mysql-bin.log
    
    relay-log   = replication-1
    server_id   = 1
    

    注意:server_id = 2在复制从站上。

    另请注意,如果没有该relay-log选项,该命令SHOW MASTER STATUS;不会在主数据库容器上返回任何结果。

    还有一个可能的未决问题,默认情况下,当您使用docker stop它时,它会要求容器终止(通过向 docker entrypoint 命令发送 SIGHUP ),如果它没有在 10 秒内终止,则会被强制停止。我需要确保有足够的时间来关闭它,因为在负载下可能需要一段时间才能自行解决,结果可能导致数据丢失。

    • 0

相关问题

  • 如何阻止 MySQL 从站将更改复制到“mysql”数据库?

  • 在同一台物理服务器上运行复制是不明智的吗?

  • 有没有办法以小于 1 秒的分辨率测量 MySQL 中的复制滞后?

  • 运行时间偏移延迟复制的最佳实践

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve