当与MyISAM混合时,InnoDB表在mysqldump过程中被locking了吗?

我正在为我的mysql服务器寻找一个备份解决scheme,我需要尽可能减less停机时间。 我有以下几点:

  • MySQL服务器
  • 他们不复制
  • 每个服务器代表它自己的

这个数字可以增长,所以设置主/从复制不是一个好主意。

我看到的最简单的备份方式是使用mysqldump和“automysqlbackup”这样的软件。 我最重要的数据使用InnoDB。 我的InnoDB表很重。

问题是:如果我对服务器中的所有数据库执行mysqldump,它会locking我的Innodb表吗?

    与InnoDB和MyISAM在一起的mysqldumps被视为互斥。 这是为什么:

    如果您可以在mysqldump正在进行时login到mysql,则会看到如下所示的内容:

    SELECT /* SQL_NO_CACHE */ * FROM tblname 

    默认情况下,mysqldump将执行以下操作:

    • 每个数据库都按字母顺序排列
    • 每个数据库转储的每个表都按字母顺序排列(不pipe存储引擎如何)

    对于没有其他数据库活动的MySQL实例,这应该没问题。 InnoDB表和MyISAM表不会相互影响。

    对所有InnoDB MySQL实例使用--single-transaction将创build一个检查点,并从相同的时间点转储所有表。 一旦遇到MyISAM表,所有投注都closures。 MyISAM之后的所有InnoDB表可以从不同的时间点转储。

    要有InnoDB和MyISAM混合的一致性时间点转储,您可以select

    选项1

    重新启动mysql,以便其他人不能通过TCP / IP和mysqldumplogin

     service mysql restart --skip-networking --skip-grant-tables mysqldump --routines --triggers --all-databases > MySQLData.sql service mysql restart 

    选项#2

    如果所有的MyISAM表只用于读取,只需使用mysqldump –single-transaction

    选项#3

    如果正在编写任何MyISAM表, – 单一事务是不够的

    您将需要执行以下操作:

     mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)" sleep 30 mysqldump --routines --triggers --all-databases > MySQLData.sql 

    在mysqldump完成之后,立即login到mysql并show processlist; 。 查找查询SELECT SLEEP(86400) ,查找进程ID,然后运行KILL <procidnumn>;

    mysqldump --single-transaction不locking表,但MyISAM表不能保证与此选项一致的转储。 最好使用mydumpermydumper锁MyISAM表,并且不lockingInnoDB,因此转储是一致的。

    mysqldump在转储期间locking表。 使用LVM快照或Xtrabackup 。