以下是我无法更改的内容: 我们有一个运行主服务器和一些从服务器的 mySQL myISAM 复制。使用 mysqldump 正在使用一个从属服务器进行夜间备份。与主服务器相比,备份使用重锁迫使它的从服务器“老化”。mysqldump 以 root 身份连接所有数据库,而其他所有连接都在每个数据库使用一个非超级用户。转储使用专用备份服务器上的简单 shell 脚本启动。
这是问题所在:我想检测备份是否正在运行,同时作为“普通”用户连接到正在备份的服务器上运行的数据库之一。Cronjobs 应该能够通过提前退出或仅处理不能等到备份完成的非常重要的必需作业来对正在运行的备份做出反应。运行备份脚本的服务器与网络服务器没有连接,它们唯一的共同点是 mysql 服务器。备份脚本可以做一些事情来将服务器标记为“当前正在运行备份”。我更愿意设置某种“所有用户可见的全局服务器端环境变量”以仅忽略运行备份的一个从属设备,但也可以简单地知道备份正在该数据库或复制链上运行.
我试图在备份开始时创建一个临时表(现有 = 备份正在运行,不存在 = 没有备份运行),但临时表只显示最初创建它的连接(如预期的那样)。如果非超级用户可以获得查看包括其他用户和 root 在内的所有连接的 SHOW PROCESSLIST 的权限(来自备份服务器的任何连接 = 备份正在运行),我进行了搜索 - 但没有运气。向所有数据库用户提供 SUPER 是没有选择的。
有什么建议么?
感谢您阅读(和回答)。
在这种情况下,您唯一的希望是拥有 PROCESS 特权。
SUPER 权限允许您终止进程。自然,你不希望这样。另一方面,PROCESS 权限允许您查看进程列表。
根据关于 PROCESS Privilege 的 MySQL 文档
好的,大交易。PROCESS Privilege 允许您查看进程列表。这有什么帮助?
SHOW PROCESSLIST;
当您运行并在 Info 字段中看到类似这样的模式时,您可以快速检测到正在进行的 mysqldump :如果你有 PROCESS 权限并且运行 MySQL 5.1+,你可以运行这个查询:
这是一个示例输出:
您需要做的就是查询该号码。如果你得到一个非零值,mysqldump 必须正在运行。
试试看 !!!
让您的备份脚本在备份开始之前在某个单独的表中设置一个值,并在备份结束时将其重置。然后,您可以只查询该值。
您可能需要阅读有关使用 LVM 快照备份 myisam 表并将复制停机时间缩短到几分钟的信息:
http://www.mysqlperformanceblog.com/2006/08/21/using-lvm-for-mysql-backup-and-replication-setup/
如果您能够迁移到 innodb,您可以使用xtrabackup并进行实时备份,几乎没有明显的干扰。
编辑
就个人而言,我们使用 LVM 快照来处理跨越 3 个数据库的约 220 GB 实例。LVM 快照的开销和磁盘上的负载导致复制每晚最多延迟 8,000 秒。没有任何锁定,但可怜的小磁盘无法跟上繁重的复制负载和备份。我们不得不切换到 fusion io。这当然很好——但非常昂贵。