Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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
在不锁定表的情况下运行MySQLDump_Mysql - Fatal编程技术网

在不锁定表的情况下运行MySQLDump

在不锁定表的情况下运行MySQLDump,mysql,Mysql,我想将实时生产数据库复制到本地开发数据库中。有没有一种方法可以在不锁定生产数据库的情况下执行此操作 我目前正在使用: mysqldump-u root--password=xxx-h xxx my_db1 | mysql-u root--password=xxx-h localhost my_db1 但是它在运行时锁定了每个表。锁表选项是否有效 根据,如果您正在转储InnoDB表,则可以使用--single transaction选项: ——锁表,-l 在转储之前锁定所有表。这些表被READ锁

我想将实时生产数据库复制到本地开发数据库中。有没有一种方法可以在不锁定生产数据库的情况下执行此操作

我目前正在使用:

mysqldump-u root--password=xxx-h xxx my_db1 | mysql-u root--password=xxx-h localhost my_db1
但是它在运行时锁定了每个表。

锁表选项是否有效

根据,如果您正在转储InnoDB表,则可以使用
--single transaction
选项:

——锁表,-l
在转储之前锁定所有表。这些表被READ锁定
LOCAL允许在MyISAM表的情况下进行并发插入。对于
事务表,如InnoDB和BDB,--单个事务是
一个更好的选择,因为它不需要将表锁定在
全部的
对于innodb DB:

mysqldump --single-transaction=TRUE -u username -p DB

老实说,我会为此设置复制,就像不锁定表一样,您将从转储中获得不一致的数据

如果转储需要更长的时间,那么已经转储的表可能会随着某个即将转储的表一起更改


因此,要么锁定表,要么使用复制。

答案因您使用的存储引擎而异。理想的情况是使用InnoDB。在这种情况下,您可以使用
--single transaction
标志,它将在转储开始时为您提供数据库的一致快照。

这太晚了,但对搜索主题的任何人都有好处。如果您不是innoDB,并且不担心转储时的锁定,只需使用以下选项:

--lock-tables=false

--skip add locks
对我有帮助

要转储大型表,应该将--single transaction选项与--quick组合使用

    mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db |   mysql -u root --password=xxx -h localhost db

这与那个说他迟到的家伙的回答差不多,但就我而言(通过Windows 7上的WAMP访问MySQL),我不得不使用:

--skip-lock-tables

对于InnoDB表,使用标志
--单事务

它在开始时转储数据库的一致状态 在未阻止任何应用程序的情况下发布

MySQL文档


由于这些方法对我都不起作用,我只是做了一个:

mysqldump [...] | grep -v "LOCK TABLE" | mysql [...]
它将排除
锁定表
解锁表
命令

注意:希望您的数据中不包含该字符串

另一个迟来的回答:

如果您试图创建服务器数据库的热拷贝(在linux环境中),并且所有表的数据库引擎都是MyISAM,则应该使用
mysqlhotcopy

根据文件:

它使用FLUSH表、LOCK表和cp或scp来创建数据库 备份这是一种快速备份数据库或单个数据库的方法 表,但它只能在数据库所在的同一台计算机上运行 目录位于。mysqlhotcopy仅用于备份 MyISAM和归档表

锁表的时间取决于服务器复制MySQL文件的时间(它不进行转储)。

原因是:

有些选项,例如--opt(默认情况下启用),会自动启用--lock表。如果要覆盖此选项,请使用选项列表末尾的--skip lock tables


使用MySQL Workbench时,在数据导出时,单击高级选项并取消选中“锁定表”选项


如果您使用Percona XtraDB群集- 我发现 --跳过添加锁
到mysqldump命令 允许Percona XtraDB群集运行转储文件
转储文件中的LOCK TABLES命令没有问题。

整个数据库几乎都是只读的,因此我不太担心它的更改。此注释不正确。MVCC允许读取InnoDB上的一致状态,而无需锁定。如果尚未设置复制,则需要进行转储以进行设置。同样的问题也存在。如果尚未设置复制,则需要锁定表以进行转储,以确保数据完整性。所以这是第22条陷阱。感谢您的回复Warren,这非常有帮助,效果非常好。使用“--lock table=false--quick”使用的服务器资源最少,但您应该担心锁定表。如果在mysqldump运行时写入多个表(并且使用外键),则转储可能不一致。在还原它并对不一致的数据运行联接查询之前,您不会知道。可能需要一段时间才能发现不一致的数据,因为连接是由您的应用程序而不是Mysql(使用MyISAM表)使用的;恢复工作正常,mysql不会就不一致性向您发出警告。所以:MyIsam->始终锁定您的表。InnoDB->use
--single transaction
@Costa我认为锁定表对于MyISAM表来说是不够的。如果mysqldump将表锁定在应用程序执行的查询之间,则会出现相同的不一致。答案更简单:MyISAM->改用InnoDB。@Costa您肯定应该担心锁定表,但前提是您确实需要一致的转储。有一些罕见的情况下,你不这样做。例如,数据库范围转储(调试)上的粗糙fgrep:我打赌用户不希望等待约20分钟来创建生产数据库转储(真实故事)。如果要获得转储,不仅要尽快,而且要一致,那么应该转储复制的从机或使用较低级别的快照(lvm、zfs、btrfs等),请记住,
使用读锁刷新表。
stuff。或者--压缩以包括带有其他优化的跳过锁。这会从转储文件中删除锁表和解锁表语句,不会影响导出期间的锁定。不,这不是您要找的!见dabest1的评论。在执行mysqldump时,这并不能防止表被锁定。这不是一个好主意