我们正在使用 MyIsam 引擎,由于跳过了 inndb 引擎 [my.cnf skip-innodb],Percona-xtrabackup 抛出了以下错误。如何在不启用 inndb 引擎的情况下解决此问题?
percona-xtrabackup-2.0.0/bin:# ./innobackupex-1.5.1 --user="root" --password=*** --defaults-file="/etc/my.cnf" --socket=<path>/mysql.sock1 --ibbackup=<path>/percona-xtrabackup-2.0.0/bin/xtrabackup <path>/testbackup/
Percona 日志:
This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.
IMPORTANT: Please check that the backup run completes successfully.
At the end of a successful backup run innobackupex-1.5.1
prints "completed OK!".
innobackupex-1.5.1: Using mysql Ver 14.14 Distrib 5.1.57, for pc-linux-gnu (i686) using readline 5.1
innobackupex-1.5.1: Using mysql server version Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
innobackupex-1.5.1: Created backup directory <path>/testbackup/2012-06-08_16-55-23
120608 16:55:23 innobackupex-1.5.1: Starting mysql with options: --defaults-file='/etc/my.cnf' --password=xxxxxxxx --user='root' --socket='/data/mysql1/mysql.sock1' --unbuffered --
120608 16:55:23 innobackupex-1.5.1: Connected to database with mysql child process (pid=25611)
120608 16:55:25 innobackupex-1.5.1: Connection to database server closed
120608 16:55:25 innobackupex-1.5.1: Starting ibbackup with command: <path>/percona-xtrabackup-2.0.0/bin/xtrabackup --defaults-file="/etc/my.cnf" --backup --suspend-at-end --target-dir=<path>/testbackup/2012-06-08_16-55-23
innobackupex-1.5.1: Waiting for ibbackup (pid=25618) to suspend
innobackupex-1.5.1: Suspend file '<path>/testbackup/2012-06-08_16-55-23/xtrabackup_suspended'
<path>/percona-xtrabackup-2.0.0/bin/xtrabackup version 2.0.0 for Percona Server 5.1.59 pc-linux-gnu (i686) (revision id: undefined)
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /data/mysql1
xtrabackup: Target instance is assumed as followings.
xtrabackup: innodb_data_home_dir = ./
xtrabackup: innodb_data_file_path = ibdata1:10M:autoextend
xtrabackup: innodb_log_group_home_dir = ./
xtrabackup: innodb_log_files_in_group = 2
xtrabackup: innodb_log_file_size = 5242880
InnoDB: The first specified data file ./ibdata1 did not exist:
InnoDB: a new database to be created!
120608 16:55:26 InnoDB: Setting file ./ibdata1 size to 10 MB
InnoDB: Database physically writes the file full: wait...
xtrabackup: Something wrong with source files...
innobackupex-1.5.1: Error: ibbackup child process has died at ./innobackupex-1.5.1 line 371.
答案1
有什么理由使用它吗?无论如何,它只会锁定 myiasm 表以进行转储。它实际上是一个可以执行 myiasm 的 innodb 表工具,但它会锁定它们。不妨只进行服务器范围的锁定并复制所有文件。
答案2
在仅安装 MyISAM 的环境中使用它没有任何意义innobackupex
。原因如下。
innobackupex
旨在从正在运行的数据库中创建一致的备份;即所谓的“热备份”。这仅适用于 InnoDB 表空间,因为 MyISAM 要求您对READ LOCK
要一致备份的表执行操作,只要未释放锁定,这会导致服务中断。
MyISAM 数据越多,innobackupex
锁定表的时间就越长。如果只有 MyISAM 数据,使用该工具就毫无意义 - 这与
mysql> FLUSH TABLES WITH READ LOCK
shell> cp -a /path/to/datadir/of/mysql /path/to-backup/dir
- 等结束了
mysql> UNLOCK TABLES
。
而对于 InnoDB 来说,innobackupex
只是开始复制,然后在稍后准备更新时应用事务日志(--apply-log
),离线/独立。
答案3
如果您因为认为过程很困难而拒绝转换到 InnoDB,我使用的方法如下:
mysql -u root --password=<password> --database=db_name -B -N -e "SHOW TABLES" | awk '!/not_this_db/ && !/or_this_one/ && /^[a-z]/ {print "ALTER TABLE", $1, "ENGINE=INNODB;"}' | mysql -u root --password=<password> --database=db_name
您可以使用正则表达式排除和包含数据库,例如在上面的示例中仅包含以小写字母开头的 dbs。
当然,修改将锁定表,但从那时起您就可以使用 xtrabackup。
答案4
我在启用 innobackupex 的新创建的数据库上运行 innobackupex 时遇到了同样的问题skip-innodb
。似乎 innobackupex 需要有一个可运行的 InnoDB 存储引擎,即使它没有被使用,当它试图为你生成一个时会出错。
在我启动数据库一次并#skip-innodb
在 /etc/my.cnf 中注释掉之后(我必须删除备份脚本生成的 ibdata1 文件,因为它已损坏),然后关闭它并取消注释该skip-innodb
行,备份脚本按预期工作。
我猜人们不会再遇到这么多问题了,因为仍然运行仅 MyISAM 的数据库的情况并不常见。