Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
备份MySQL数据库_Mysql_Backup_Mysqldump_Blocking - Fatal编程技术网

备份MySQL数据库

备份MySQL数据库,mysql,backup,mysqldump,blocking,Mysql,Backup,Mysqldump,Blocking,我有一个大约1.7GB的MySQL数据库。我通常使用mysqldump进行备份,这大约需要2分钟。不过,我想知道以下问题的答案: mysqldump是否阻止对数据库的读写操作?因为在实时场景中,我不希望在备份数据库时阻止用户使用数据库 对我来说,每周只备份一次整个数据库是非常理想的,但是在中间几天,只需要备份一个表,因为其他表不会改变。有没有办法做到这一点 出于这些目的,mysqlhotcopy是更好的选择吗 不,您可以使用--lock tables指定要锁定的表,但默认情况下不是这样 如果未指

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

  • mysqldump是否阻止对数据库的读写操作?因为在实时场景中,我不希望在备份数据库时阻止用户使用数据库

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

  • 出于这些目的,mysqlhotcopy是更好的选择吗

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

    mysqldump[options]db_name[tables]

  • 抱歉,我没有使用它,但是我运行了很多MySQL数据库,一些比1.7gb大一些比1.7gb小,我使用mysqldump进行所有备份


  • mysqlhotcopy在读锁丢失的某些情况下不起作用, 并且不适用于INNODB表

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

    来自MySQL文档


    mysqlhotcopy是一个Perl脚本,最初由Tim Bunce编写和贡献。它使用锁表、刷新表和cp或scp快速进行数据库备份。这是备份数据库或单个表的最快方法,但它只能在数据库目录所在的同一台计算机上运行。mysqlhotcopy仅用于备份MyISAM和归档表。它在Unix和NetWare上运行

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

    再见。

    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表的热备份。最近也有一个新的开源软件用于此目的-


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

    将mysql从站添加到您的设置中可以让您在不锁定生产数据库的情况下进行一致备份

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

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

    如果您在具有LVM磁盘的linux服务器或具有VSS的windows服务器上运行MySQL,您应该签出。
    它需要磁盘上数据的二进制差异,这比数据库的文本转储读取和恢复快得多。

    Maatkit转储可能有用

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