我在现有的 MySQL 复制中添加了一个额外的从服务器。主服务器和旧的从服务器都正常工作,没有任何问题,但新添加的服务器因以下错误而停止:
Last_SQL_Errno: 1032
Last_SQL_Error: 无法在表 xxx.email_events 上执行 Update_rows 事件;在“email_events”中找不到记录,错误代码:1032;处理程序错误 HA_ERR_KEY_NOT_FOUND; 事件的主日志 mysqld-bin.000410, end_log_pos 368808733
修好几个小时后就好了。
问题
我的从数据库 (MySQL 5.7.12) 上的复制突然停止工作。当我运行时,SHOW SLAVE STATUS\G我看到以下错误:
Last_Errno: 1396
Last_Error: Error 'Operation CREATE USER failed for 'user'@'ip'' on query. Default database: ''. Query: 'CREATE USER 'user'@'ip' IDENTIFIED WITH 'mysql_native_password' AS '*password''
Run Code Online (Sandbox Code Playgroud)
我最近在我的主人和我的奴隶上创建了 2 个新的只读用户,所以我确定这是因为这个。
我也在状态中看到了这一点:
Slave_IO_Running: Yes
Slave_SQL_Running: No
Run Code Online (Sandbox Code Playgroud)
对于如何解决这个问题,有任何的建议吗?
谢谢你。
即将开始使用 MySQL 复制,我想知道最好使用哪种 binlog 格式?有 Row、Statement 和 Mixed。
我将使用 5.1.49。
Row 目前正在获胜,但我只是想知道为什么我应该使用混合而不是行。
非常感谢,
德伦达
我已经实现了一个基于主-主复制的 mysql HA 解决方案。前端部分有一种机制可以保证在给定时间只有一个 db 将被读/写(即我们只对 HA 使用复制)。
我已经确认复制按预期工作,但我想知道故障场景和恢复。特别是,我担心当一个 master 在不可恢复状态下失败时会发生什么,并且需要从另一个 master 重新创建:
mysqldump(我们的数据库相当大,并且mysqldump在使用几个月后很容易花费数小时)。第一个问题的简单解决方案是使用第三个数据库作为备份,我可以从中执行mysqldump. 但是,我如何确保重新创建的 master 可以以一致的方式从正在运行的 master 开始复制?
我有完整磁盘的问题
-rw-rw---- 1 mysql mysql 1073741982 2012-07-03 18:14 mysql-bin.000034
-rw-rw---- 1 mysql mysql 1073741890 2012-07-04 14:39 mysql-bin.000035
-rw-rw---- 1 mysql mysql 1073741988 2012-07-05 09:16 mysql-bin.000036
-rw-rw---- 1 mysql mysql 1073741964 2012-07-06 00:04 mysql-bin.000037
-rw-rw---- 1 mysql mysql 1073741974 2012-07-06 21:45 mysql-bin.000038
-rw-rw---- 1 mysql mysql 1073741923 2012-07-07 19:05 mysql-bin.000039
-rw-rw---- 1 mysql mysql 356167680 2012-07-07 23:47 mysql-bin.000040
Run Code Online (Sandbox Code Playgroud)
我的.cnf:
max_binlog_size = 1073741824
log-bin = mysql-bin
max_relay_log_size = 1G
relay_log_space_limit = 2G
Run Code Online (Sandbox Code Playgroud)
mysql 正在创建文件 mysql-bin.xxxxx 并且几天后我的磁盘已满。
如何让mysql删除旧日志?
监视从站以确保它是的最佳实践是什么
a) 仍在运行 b) 作为主站不会太远
我想通过电子邮件提醒它是否落后,很高兴编写一两个脚本来挂钩命令行应用程序。
我见过Cron 同步 mysql 表。但我不能使用复制。我曾经使用过percona-toolkit,它工作得很好。我可以按需运行同步命令,也可以通过 cron 运行它。它会比较两个表上的校验和并执行插入、更新、删除等操作。但是,Perl(DBD::mysql) 和 MySQL 在我要运行的新服务器中存在一些不兼容问题,并且我不能使用 pt-table-同步。是否有类似的解决方案使用 Perl/DBD 以外的其他东西?
编辑:(更多细节,清晰)
我将按照本指南为 MySQL 复制(1 个主和 1 个从)设置故障转移:https : //github.com/jayjanssen/Percona-Pacemaker-Resource-Agents/blob/master/doc/PRM-setup-guide .rst
这是输出crm configure show:
node serving-6192 \
attributes p_mysql_mysql_master_IP="192.168.6.192"
node svr184R-638.localdomain \
attributes p_mysql_mysql_master_IP="192.168.6.38"
primitive p_mysql ocf:percona:mysql \
params config="/etc/my.cnf" pid="/var/run/mysqld/mysqld.pid"
socket="/var/lib/mysql/mysql.sock" replication_user="repl"
replication_passwd="x" test_user="test_user" test_passwd="x" \
op monitor interval="5s" role="Master" OCF_CHECK_LEVEL="1" \
op monitor interval="2s" role="Slave" timeout="30s"
OCF_CHECK_LEVEL="1" \
op start interval="0" timeout="120s" \
op stop interval="0" timeout="120s"
primitive writer_vip ocf:heartbeat:IPaddr2 \
params ip="192.168.6.8" cidr_netmask="32" \
op monitor interval="10s" \
meta is-managed="true"
ms ms_MySQL p_mysql \ …Run Code Online (Sandbox Code Playgroud) failover mysql-replication high-availability pacemaker corosync
tl; dr:复制在特定的二进制日志和位置上停滞,我不知道为什么
我有 MySQL 5.5 的 MySQL 复制设置。
这种复制设置没有落后的历史,而且一直很可靠。
今天早上,我注意到奴隶比主人晚了 17 个小时。
做更多的研究,它看起来是 SQL_Thread 的问题。
根据从站(via SLAVE STATUS),当前的主日志文件是mysql-bin.001306@position 20520499。这与MASTER STATUSmaster的输出一致。
但是,SLAVE STATUS显示Relay_Master_Log_File当前mysql-bin.001302具有Exec_Master_Log_Pos的36573336。今天早上我一直在监视它们时,Relay_Master_Log_File也Exec_Master_Log_Pos完全没有进展。
查看 master 上的二进制日志,这是位于以下位置的语句mysql-bin.001302@3657336:
# at 36573053
#170221 14:33:48 server id 1 end_log_pos 36573130 Query thread_id=96205677 exec_time=0 error_code=0
SET TIMESTAMP=1487716428/*!*/;
BEGIN
/*!*/;
# at 36573130
# at 36573213
#170221 14:33:48 server id 1 end_log_pos 36573213 Table_map: `database-name`.`table-name` …Run Code Online (Sandbox Code Playgroud) 解释问题的背景:
我们有一个在 Linux 服务器上运行的本土 PHP 应用程序(用于运行在线语言学习课程),并在本地主机上使用 MySQL 来保存用户数据(例如,所采取的测试结果、提交的工作标记、在不同页面上花费的时间)课程等)。
由于我们有来自不同地理位置的学生,我们目前在这些位置(西班牙、英国和香港)附近托管了 3 个虚拟服务器,并且用户被添加到离他们最近的服务器(他们通过不同的 URL 访问,例如 europe.domain.com 、uk.domain.com 和 asia.domain.com)。这是有效的,但这是一个管理噩梦,因为我们必须记住特定用户在哪个服务器上,并且用户只能连接到一个服务器。我们希望以某种方式集中信息,以便所有用户在任何服务器上都可见,并且用户可以连接到 3 个服务器中的任何一个。
问题是,我们应该使用什么方法来实现这一点。这一定是很多人都遇到过的问题,但经过一番谷歌搜索后,我没有找到任何结论。我见过的最接近解决方案的是:
类似于 master-master 复制,但我已经阅读了很多帖子,表明这不是一个好主意,因为 auto_increment 字段之类的东西可能会破坏。
循环复制,这听起来很完美,但引用 O'Reilly 的高性能 MySQL,“一般来说,环是脆弱的,最好避免”
我们不反对在应用程序中重写代码以使其适用于所需的任何解决方案,但我不确定复制是否正确使用。
谢谢,
安迪
PS 我应该补充一点,我们尝试写入中央数据库,然后使用从本地数据库读取,但不同服务器之间的响应时间非常糟糕,而且写入的数据可以立即读取也很重要,因此如果复制是太慢这可能会导致返回过时的数据。
编辑:我一直在考虑编写我自己的基本复制脚本,其中包括让每个用户都有一个服务器 ID 来说明哪个是他的“家庭服务器”,例如亚洲的用户将被标记为将香港服务器作为他们自己的服务器. 然后复制脚本(这将是一个设置为合理频繁地作为 cron 作业运行的 PHP 脚本,例如每 15 分钟左右)将在系统中的每个服务器上独立运行。他们将遍历数据库并将有关用户的任何信息分发到系统中的所有其他数据库,并将“主服务器”设置为运行脚本的服务器。他们还需要吸收已添加到“家庭服务器”所在系统上的任何其他数据库中的新信息。flag 是运行脚本的服务器。我需要弄清楚细节并建立逻辑来处理冲突,但我认为这是可能的,但是我想确保没有正确的解决方案已经存在,因为它似乎必须是许多人已经遇到的问题。
mysql ×9
mysql5.5 ×2
amazon-linux ×1
corosync ×1
database ×1
failover ×1
monitoring ×1
pacemaker ×1
percona ×1
replication ×1