3

我必须制定一个备份策略。我选择 innobackupex 在 Debian 6 Squeeze 上运行。有两台服务器,生产服务器和备份服务器(如果生产服务器崩溃,它应该可以工作)。没有复制,我使用 rsync 传输备份。我有一个 php 脚本,它在 conf 文件中查找以了解何时必须进行备份。

我的问题是:如何使用 innobackupex 跳过 mysql 数据库或 users 表?

关于主人:我执行以下命令:

innobackupex --user=root --password=xxx --no-timestamp /opt/backups/full/

rsync -avz --progress -e 'ssh -i -p 1000' /opt/backups/full/ user@xxx:/home/backups/full/

这很好用

在备份服务器上,我只需要准备和恢复文件:

innobackupex --apply-log --redo-only --user=xxx --password=xxx /home/backups/full/

innobackupex --copy-back /home/backups/full --user=root --password=xxx

一切都很好,但是在备份服务器上,root 用户的密码甚至密码都更改了debian-sys-maint

root 用户密码成为主用户的密码。

我做了一个脚本来纠正这个问题。debian-sys-maint密码在文件中以明文形式写入,因此将其解/etc/mysql/debian.cnf压缩,但在 php 中(我使用 pdo 对象)我无法更改此密码,因此无法重新启动 mysql 服务器。有时我无法检索 root 用户的密码,它不是主服务器的 root 密码。

有时我可以使用 mysql 停止/启动 mysql /etc/init.d/mysql stop/start,有时使用 service mysql stop/start it 这不起作用我尝试使用:(mysqladmin -u root -p shutdown如果我可以更改密码)

如果我真的无法停止 mysql,我会这样做killall mysql(我知道这是错误的),然后我更改了 root 密码:

/usr/bin/mysqld_safe --skip-grant-tables &
mysql --user=root mysql

有人遇到和我类似的问题吗?如何使用 innobackupex 跳过 mysql 数据库?

4

3 回答 3

1

innobackupex 工具是 Percona XtraBackup 的一部分。我为 Percona 工作,我已经开发了关于 Percona XtraBackup 的培训。

innobackupex 有一些选项可以按名称或正则表达式备份特定数据库。@YaK 提供了一个选项,或者您可以在此处查看其他选项:http ://www.percona.com/doc/percona-xtrabackup/innobackupex/partial_backups_innobackupex.html

但是,--copy-back假设您要将完整备份还原到的数据目录。即如果目标目录不为空,--copy-back将给出错误并拒绝覆盖文件。

如果您尝试将 InnoDB 表还原到已经拥有mysql数据库的实例,则必须手动进行还原。这可以像mv将文件使用到现有数据目录中一样简单(当然,关闭 MySQL 服务器)。还记得chown mysql:mysql在启动 mysqld 之前对文件使用。

PS:恢复前不需要使用--redo-only。该选项用于进行增量备份,即使这样,您也会在进行最终还原之前跳过该选项。

于 2013-06-25T17:58:03.180 回答
0

我相信你正在使用Percona 的这个工具

那么我能找到的唯一有用的选项是--databases. 我假设您不想在脚本中维护数据库列表,您可以使用如下命令动态构建列表:

    外壳 > mysql [选项] -NBe \
            “从 information_schema.schemata 中选择 schema_name,其中 schema_name 不在('mysql','information_schema')”

您应该能够将此调用集成到以下内容中:

    外壳 > innobackupex \
            --databases=`mysql [选项] -NBe \
            “SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('mysql', 'information_schema')”`

(可能需要一些额外的双引号,抱歉,我目前无法使用该工具)

于 2013-06-25T16:44:03.347 回答
0

谢谢你的回答。

是的,我所有的表都在 InnoDB 引擎上工作。感谢您的建议 Bill Karwin,但 innobackupex 是一个很棒的工具,我将使用它来忽略 mysql 数据库--databases

是的,我读的--redo-only是增量,我也做增量。在主服务器上,我有一个名为full和一个名为的目录incremental,在最后一次增量之后,我删除了这些目录。

测试后,如果一切正常,我会通知您。

于 2013-06-26T07:48:16.800 回答