innobackupex流tar并从php运行

时间:2013-06-27 17:54:06

标签: php mysql linux backup debian

我正在尝试在php中创建备份脚本,但无法使其正常工作..

首先我尝试从命令行运行它:

innobackupex --user=root --password=xxx --databases="dbtest" /var/www_backup

它可以工作并将所有db文件转储到目录

然后我从命令行尝试了这个:

innobackupex --user=root --password=xxx --databases="dbtest" --stream=tar ./ | gzip -c -1 > /var/www_backup/`date +%Y-%m-%d-%H-%M-%S`.tar.gz

它创建了一个.tar.gz文件,但是在打开文件时它只包含一个backup-my.cnf ..?! backup-my.cnf的文件大小约为244个字节,但整个.tar.gz文件大约是2mb!这没有意义......文件有问题..

然后我尝试从网络服务器

运行第一个工作命令
$syntax = 'innobackupex --user='.$mysql_user.' --password='.$mysql_pass.' --databases="'.$mysql_db.'" /var/www_backup';
exec($syntax, $output, $return);
echo "output\n";
print_r($output);
echo "return\n";
print_r($return);

没有创建文件,但会返回

output
Array
(
)
return
3

php已经可以访问目标目录

chown -R www-data /var/www_backup

1 个答案:

答案 0 :(得分:3)

  

它创建了一个.tar.gz文件,但是在打开文件时它只包含一个backup-my.cnf ..?!

您必须使用tar的-i选项来提取或查看Percona XtraBackup创建的tar文件的内容。这是记录的,并且在innobackupex过程结束时输出提醒:

. . .
130630 10:40:23  innobackupex: Connection to database server closed
innobackupex: You must use -i (--ignore-zeros) option for extraction of the tar stream.
130630 10:40:23  innobackupex: completed OK!

省略-i选项会导致您看到的行为:只有tar档案中的第一个文件可见。


  

然后我尝试从网络服务器运行第一个工作命令...没有创建文件... PHP已经可以访问目标目录

innobackupex进程必须具有MySQL数据库下的数据和日志文件的读权限,以及保存备份输出的写权限。

你应该看到这样的错误:

130630 10:36:20  InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
InnoDB: File name ./ibdata1
InnoDB: File operation call: 'open'.
InnoDB: Error in opening ./ibdata1

但它可能已丢失,因为PHP exec()致电discards stderr output


重新评论8/4:

好的,我自己尝试使用最新的XtraBackup和最新的Percona Server。

我需要从shell测试这个,所以我可以看到错误输出。当您仅从PHP脚本运行它时,您不会看到发生的错误。一旦你开始工作,你应该能够将gid更改为www-data并让它继续工作。

我通过将所有文件的组所有权更改为我自己用户的gid来进行测试。

$ cd /var/lib/mysql     # use your datadir if it is different
$ chgrp -R billkarwin .

无需在默认安装上chmod任何内容。但是此时您的文件权限可能不正确,因此您需要将它们还原为有效的方式:

$ cd /var/lib/mysql     # use your datadir if it is different
$ chmod -R 660 .
$ chmod 770 . */.
$ chmod 777 mysql.sock

然后我可以运行innobackupex,但我必须指定mysql凭据:

$ innobackupex --user=root --password=XXXX /tmp

130804 08:56:33  innobackupex: Connecting to MySQL server with DSN
'dbi:mysql:;mysql_read_default_group=xtrabackup' as 'root'  (using password: YES).
130804 08:56:33  innobackupex: Connected to MySQL server
. . .
130804 09:53:46  innobackupex: Connection to database server closed
130804 09:53:46  innobackupex: completed OK!

请注意,您还可以将[xtrabackup]组添加到用户自己的$ HOME / .my.cnf中,这样您就不必将凭据放在命令行中。

$ cat > ~/.my.cnf
[xtrabackup]
user=root
password=XXXX
^D
$ innobackupex /tmp