用了xtrabackup 感觉还是非常不方便,主要是我的数据更新非常非常不频繁,数据量也不大。
还是自己重复造轮子,用php写一个全量备份脚本吧,你可能会问我为什么不用mysqldump呢? mysqldump 也能单表备份。主要的一个原因还是mysqldump也不方便,备份的垃圾信息也比较多。
用这个脚本定时全量备份一次+mysql的binlog 增量备份,备份的数据通过svn或者rsync到远程服务器,简直就是爽歪歪。
<?php
set_time_limit(0);
//需要备份的数据库名
$dbs = ['test','test1'];
$user = 'root';
$password = 'password';
define('DIR', '/data/backup/mysql/');
// pdo连接对象,$name数据库名 ,所有表名
function backFile($pdo, $name, $tables){
foreach($tables as $row){
$table = $row['Name'];
$fn = DIR . $name . '/' . $table . '.sql';
if(file_exists($fn) && filemtime($fn) > strtotime($row['Update_time'])){
continue;
}
try{
$fp = fopen($fn, 'w');
// 表结构
$sql = "DROP TABLE IF EXISTS `" . $table . '`;' . "\n";
fwrite($fp, $sql);
$arr = $pdo->query("show create table `$table`")->fetch(PDO::FETCH_NUM);
fwrite($fp, $arr[1] . ";\n");
// 表数据
if($row['Rows'] > 0){
fwrite($fp, "\nINSERT INTO `" . $table . "` VALUES");
$i = 0;
foreach($pdo->query("select * from `$table`") as $v){
foreach($v as $k => $v2){
if(!is_numeric($v2)){
$v[$k] = "'" . addslashes($v2) . "'";
}
}
if((++$i) != $row['Rows']){
fwrite($fp, "\n(" . implode(',', $v) . "),");
}else{
fwrite($fp, "\n(" . implode(',', $v) . ")");
}
}
fwrite($fp, ";\n\n");
}
fclose($fp);
}
catch(Exception $e){
unlink($fn);
echo $e->getMessage();
return false;
}
}
}
$pdo = new PDO("mysql:host=localhost;dbname=test;port=3306;charset=utf8", $user, $password,[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]);
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
foreach($dbs as $name){
if(!is_dir(DIR . '/' . $name)){
mkdir(DIR . '/' . $name, 0755, true);
}
$pdo->query('use ' . $name);
$tables = $pdo->query("show table status from $name")->fetchAll(PDO::FETCH_ASSOC);
backFile($pdo, $name, $tables);
}