繁体   English   中英

备份MySQL数据库

[英]Backup MySQL database

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

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

  2. 对我来说,理想的做法是只在一周内备份一次WHOLE数据库,但在中间时间,只需要备份一个表,因为其他表不会更改。 有没有办法实现这个目标?

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

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格式的文件。

再见。

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表的hotbackup,有一些商业工具(非常昂贵)。 最近还有一个用于此目的的新开源 - Xtrabackup

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

在您的设置中添加mysql slave可以让您在不锁定生产数据库的情况下获取一致的备份。

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

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

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

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

  1. 不,您可以使用--lock-tables指定要锁定的表,但默认情况下不是这样
  2. 如果未指定任何表,则会备份整个数据库,或者您可以指定表列表:

    mysqldump [options] db_name [tables]

  3. 没用过对不起,不过我运行了一些MySQL数据库,有些大于1.7gb,我使用mysqldump进行备份。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM