运行MySQLDump而不锁定表

Gre*_*reg 422 mysql database

我想将一个实时生产数据库复制到我的本地开发数据库中.有没有办法在不锁定生产数据库的情况下执行此操作?

我目前正在使用:

mysqldump -u root --password=xxx -h xxx my_db1 | mysql -u root --password=xxx -h localhost my_db1
Run Code Online (Sandbox Code Playgroud)

但它在运行时锁定每个表.

Joh*_*kin 606

--lock-tables=false选项是否有效?

根据手册页,如果要转储InnoDB表,可以使用以下--single-transaction选项:

--lock-tables, -l

Lock all tables before dumping them. The tables are locked with READ
LOCAL to allow concurrent inserts in the case of MyISAM tables. For
transactional tables such as InnoDB and BDB, --single-transaction is
a much better option, because it does not need to lock the tables at
all.
Run Code Online (Sandbox Code Playgroud)

对于innodb DB:

mysqldump --single-transaction=TRUE -u username -p DB
Run Code Online (Sandbox Code Playgroud)

  • 对于innodb DB mysqldump --single-transaction = TRUE -u username -p DB (23认同)
  • 如果你有innodb和myisam怎么办? (18认同)

小智 287

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

--lock-tables=false
Run Code Online (Sandbox Code Playgroud)

  • 但你*应该担心锁定表格.如果在mysqldump运行时(并且您使用外键)写入多个表,则转储可能不一致.在恢复它并碰巧对不一致的数据运行JOIN查询之前,您不会知道.可能需要一段时间才能发现不一致的数据,因为您的应用程序使用JOIN而不是Mysql(使用MyISAM表); 恢复将正常工作,mysql不会警告你不一致.所以:MyIsam - >总是锁定你的桌子.InnoDB - >使用`--single-transaction`. (42认同)
  • @Costa我认为锁定表甚至不足以支持MyISAM表.如果mysqldump锁定应用程序执行的*查询之间的表*,那么最终会出现相同的不一致.答案更简单:MyISAM - >使用InnoDB. (12认同)
  • 使用'--lock-table = false --quick'使用最少的服务器资源 (7认同)

dvo*_*rak 45

答案取决于您使用的存储引擎.理想的情况是你使用的是InnoDB.在这种情况下,您可以使用该--single-transaction标志,该标志将在转储开始时为您提供数据库的连贯快照.


小智 38

--skip-add-locks 对我有帮助

  • 这将从转储文件中删除LOCK TABLES和UNLOCK TABLES语句,它不会影响导出期间的锁定. (71认同)
  • 不,这不是你想要的!请参阅dabest1的评论.这并不妨碍你的表在执行mysqldump时被锁定.这不是问题的答案. (10认同)
  • @dabest 和 @orrd 是正确的: `--skip-add-locks` 只会使转储恢复更快。这**不是**正确的答案。 (3认同)
  • 或者--compact包含其他优化的跳过锁. (2认同)

小智 15

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

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction

  • 选项--quick是选项的一部分 - 现在是.并且 - 默认情况下启用--opt. (2认同)

mic*_*lik 10

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

如果转储需要更长的时间,那么已经转储的表可能会随着一些只是要转储的表一起发生变化.

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

  • 如果您尚未设置复制,则需要执行转储以进行设置.存在同样的问题. (5认同)
  • 如果您尚未设置复制,则需要锁定表以执行转储以确保数据完整性.所以这是一个问题22. (3认同)
  • 此评论不正确.MVCC允许在没有InnoDB锁定的情况下读取一致状态. (2认同)

Lex*_*Lex 10

对于InnoDB表,使用--single-transaction

"它在发布BEGIN时转储数据库的一致状态而不阻塞任何应用程序" --single-transaction

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction

  • 也许与“--skip-lock-tables”一起使用。 (2认同)

dtb*_*rne 8

与那个说他迟到的家伙相比,这个问题要晚得多,但在我的情况下(MySQL通过Windows 7上的WAMP),我不得不使用:

--skip-lock-tables
Run Code Online (Sandbox Code Playgroud)


nav*_*sfx 6

    mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db |   mysql -u root --password=xxx -h localhost db
Run Code Online (Sandbox Code Playgroud)

  • 我不建议为此目的使用“--skip-opt”。这比原来问题所要求的要多得多。它关闭快速模式,它不包括字符集等。 (2认同)