备份 MySQL 数据库。

6

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

  1. mysqldump会阻止对数据库的读取和/或写入操作吗?因为在实时场景中,我不希望在备份期间阻止用户使用数据库。

  2. 对于我来说,只需在一周内备份整个数据库一次,而在中间几天只需要备份一个表格,因为其他表格不会更改,这将是理想的。有办法实现这一点吗?

  3. mysqlhotcopy是否是这些目的的更好选择?

6个回答

5

mysqlhotcopy 在某些情况下会失去读锁,且不支持 INNODB 表格的备份。

mysqldump 更加常用,因为它可以备份所有类型的表格。

来自 MySQL 文档:

mysqlhotcopy 是一个 Perl 脚本,最初由 Tim Bunce 撰写并贡献。它使用了 LOCK TABLES,FLUSH TABLES 和 cp 或 scp 来快速备份数据库。这是最快速备份数据库或单个表格的方法,但只能在存放数据库目录的同一台机器上运行。mysqlhotcopy 只适用于 MyISAM 和 ARCHIVE 表格的备份。它可以在 Unix 和 NetWare 上运行。

mysqldump 客户端是一个备份程序,最初由 Igor Romanenko 撰写。它可以用于将数据库或多个数据库导出备份或迁移到另一个 SQL 服务器(不一定是 MySQL 服务器)。此导出通常包含用于创建、填充表格或两者都有的 SQL 语句。然而,mysqldump 还可以用于生成 CSV,其他分隔文本或 XML 格式的文件。

再见。


3

1) mysqldump只有在你要求它时才会阻塞(其中之一是--lock-tables、--lock-all-tables、--single-transaction)。但如果你希望备份保持一致,那么mysqldump应该阻塞(使用--single-transaction或--lock-all-tables),否则你可能会得到一个不一致的数据库快照。注意:--single-transaction仅适用于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,但如果您需要,应该很容易添加。


3
将mysql从库添加到您的设置中,可以让您在不锁定生产数据库的情况下进行一致的备份。
添加从库还会提供更改的二进制日志。转储是您在转储时数据库的快照。二进制日志包含所有修改数据的语句以及时间戳。
如果您在白天遇到故障,并且每天只备份一次,则会丢失半天的工作。使用二进制日志和mysqldump,您可以从前一天恢复并“播放”日志,直到故障点。

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

如果您在Linux服务器上使用LVM磁盘或Windows服务器上使用VSS运行MySQL,则应查看Zamanda。它获取磁盘上数据的二进制差异,比数据库的文本转储更快读取和恢复。

2
  1. 不,你可以使用 --lock-tables 来指定要锁定的表,但默认情况下不会锁定。
  2. 如果您没有指定任何表,则将备份整个数据库,或者您可以指定一个表列表:

    mysqldump [options] db_name [tables]

  3. 抱歉我没有使用过它,但我运行了许多MySQL数据库,一些比1.7GB大,一些比1.7GB小,我使用mysqldump进行所有备份。


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"; }
    }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接