6

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

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

  2. 对我来说,只在一周内备份一次整个数据库是理想的,但在中间几天只需要备份一个表,因为其他表不会改变。有没有办法做到这一点?

  3. 对于这些目的,mysqlhotcopy 是更好的选择吗?

4

6 回答 6

5

mysqlhotcopy在 readlock 丢失的某些情况下不起作用,并且不适用于 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 格式的文件。

再见。

于 2009-08-18T08:39:40.883 回答
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 支持,但如果这是您需要的,应该很容易添加。

于 2009-08-23T11:20:27.423 回答
3

在您的设置中添加一个 mysql 从属服务器可以让您在不锁定生产数据库的情况下进行一致的备份。

添加从属服务器还会为您提供二进制更改日志。转储是您进行转储时数据库的快照。二进制日志包含修改数据的所有语句以及时间戳。

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

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

如果您在带有 LVM 磁盘的 linux 服务器或带有 VSS 的 Windows 服务器上运行 MySQL,您应该查看Zamanda。它采用磁盘上数据的二进制差异,读取和恢复比数据库的文本转储快得多。

于 2009-08-29T00:51:09.717 回答
2
  1. 不,您可以使用 --lock-tables 指定要锁定的表,但默认情况下它们不是
  2. 如果您不指定任何表,则备份整个数据库,或者您可以指定表列表:

    mysqldump [选项] db_name [表]

  3. 抱歉,没有使用它,但是我运行了一些 MySQL 数据库,一些更大一些小于 1.7gb,我使用 mysqldump 进行所有备份。

于 2009-08-18T08:08:06.077 回答
0

Maatkit 转储可能有用。

http://www.maatkit.org/doc/mk-parallel-dump.htmlhttp://www.maatkit.org/doc/mk-parallel-dump.html

于 2009-09-27T10:47:27.470 回答
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"; }
    }
于 2013-05-19T15:06:14.707 回答