2009-08-18 117 views
6

我有一个约1.7GB的MySQL数据库。我通常使用mysqldump进行备份,这大约需要2分钟。但是,我想知道下列问题的答案:备份MySQL数据库

  1. 是否mysqldump阻止对数据库的读取和/或写入操作?因为在实际场景中,我不想阻止用户在备份数据库时使用数据库。

  2. 对于我来说,在一周内只备份整个数据库是理想的选择,但在中间日期,只有一个表需要备份,而其他表不需要备份。有没有办法做到这一点?

  3. mysqlhotcopy是更好的替代方案吗?

回答

2
  1. 没有,你可以指定表使用--lock-表被锁定,但它们不是默认
  2. 如果不指定,那么整个数据库备份的任何表或者您可以指定表的列表:

    mysqldump的[选项] DB_NAME [表]

  3. 没有使用它抱歉,但是我跑了许多的MySQL DB的,一些大的一些比1.7GB和我小为我所有的备份使用mysqldump 。

+0

由于宏! – TMM 2009-08-18 08:46:43

5

mysqlhotcopy的不会在某些情况下readlock丢失, ,不与InnoDB表携手。

更多使用mysqldump,因为它可以备份各种表。

从MySQL文档

mysqlhotcopy的是最初书面和贡献的蒂姆·邦斯一个Perl脚本。它使用LOCK TABLES,FLUSH TABLES和cp或scp快速创建数据库备份。这是对数据库或单个表进行备份的最快方式,但它只能在数据库目录所在的同一台机器上运行。 mysqlhotcopy仅用于备份MyISAM和ARCHIVE表。它运行在Unix和NetWare上

mysqldump客户端是最初由Igor Romanenko编写的备份程序。它可以用于转储数据库或一组数据库以备份或传输到另一个SQL服务器(不一定是MySQL服务器)。转储通常包含用于创建表,填充它或两者的SQL语句。但是,mysqldump也可用于生成CSV,其他分隔文本或XML格式的文件。

再见。

+0

感谢RRUZ提供的有用信息! – TMM 2009-08-18 08:47:40

3

1)mysqldump只有在你提问时才会阻塞(--lock-tables,--lock-all-tables,--single-transaction之一)。但是如果你希望你的备份保持一致,那么mysqldump 应该是块(使用--single-transaction或者--lock-all-tables),否则你可能会得到不一致的数据库快照。注意: - 单事务仅适用于InnoDB。

2)确定,只是列举你想要的数据库名后要备份的表:

mysqldump OPTIONS DATABASE TABLE1 TABLE2 ... 

另外,您可以排除表,你不想:

mysqldump ... --ignore-table=TABLE1 --ignore-table=TABLE2 .. DATABASE 

所以您可以每周进行一次完整的数据库转储,并且每天只备份一次更改表。

3)mysqlhotcopy可以在MyISAM表中使用,在大多数应用程序中,您最好使用InnoDB。有些商业工具(非常昂贵)用于innodb表的热备份。最近还有一个用于此目的的新开源 - Xtrabackup

此外,要使过程自动化,您可以使用astrails-safe。它支持mysqldump和tar文件系统的数据库备份。 +加密+上传到S3,+许多其他的好东西。目前还没有xtrabackup支持,但如果这是您需要的,应该很容易添加。

+0

谢谢你的有用答案@Vitaly Kushner – kta 2014-02-15 00:17:44

3

将mysql slave添加到您的设置将允许您在不锁定生产数据库的情况下执行备份。

添加一个奴隶也给你一个变化的二进制日志。转储是您执行转储时数据库的快照。二进制日志包含修改数据的所有语句以及时间戳。

如果你在一天中的某个时候出现故障,并且每天只进行一次备份,那么你已经失去了半天的工作。使用二进制日志和mysqldump,您可以从前一天恢复,并将日志“播放”到故障点。

http://dev.mysql.com/doc/refman/5.0/en/binary-log.html

如果使用LVM磁盘上的Linux服务器或与VSS在Windows服务器上运行MySQL,你应该看看Zamanda。 它将磁盘上的数据进行二进制比较,比数据库的文本转储读取和恢复速度快得多。

0

MySQL和PHP试试这个 这也将删除文件后n天

你的答案
$dbhost = 'localhost'; 
$dbuser = 'xxxxx'; 
$dbpass = 'xxxxx'; 
$dbname = 'database1'; 
$folder = 'backups/'; // Name of folder you want to place the file 
$filename = $dbname . date("Y-m-d-H-i-s") . ".sql"; 
$remove_days = 7; // Number of days that the file will stay on the server 



$command="mysqldump --host=$dbhost --user=$dbuser --password=$dbpass $dbname > $folder$filename"; 
system($command); 

$files = (glob("$folder"."*.sql")); 

    foreach($files as $file) { 
     if(is_file($file) 
     && time() - filemtime($file) >= $remove_days*24*60*60) { // 2 days = 2*24*60*60 
      unlink($file); 
      echo "$file removed \n"; 
     } else { echo "$file was last modified: " . date ("F d Y H:i:s.", filemtime($file)) . "\n"; } 
    }