aar*_*ron 2 mysql innodb export locking
我是一名系统管理员,不会做大量的 dba 工作。对于一个项目,我可以访问一个生产服务器——我不是系统管理员——有一个巨大的 40,000,000 行 > 10 GB MySQL InnoDB 表。我想导出两个小列,其中一个是 INT(11),另一个是该表中的 VARCHAR(20) 到 CSV 或 .SQL 文件(两者都可以,我会写一个人行横道下一步没问题)。
我们可以将列 ColumnA 和 ColumnB 以及表称为 SampleTable。
MySQLdump 不是正确的工具,因为我无法指定列,而且我不需要导出一个只有两个小列的大型表。
我知道我可以执行 SELECT INTO 语句(创建一个仅包含列的新表,或者执行 SELECT INTO OUTFILE 以跳过中间步骤),但我担心这会导致生产服务器上的表级锁定. 该表是 InnoDB。
为了避免给服务器上的任何实时流量带来不便或锁定任何东西,我最好的选择是什么?
谢谢
许多专家分享了许多关于如何克服这个问题的方法。这些是我玩安全游戏的建议。
尝试在单独的会话中设置以下命令。
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
use db;
SELECT COLA, COLB into outfile '/tmp/data.csv' from TABLE_NAME;
COMMIT;
exit;
Run Code Online (Sandbox Code Playgroud)
通过这种方式,SELECT 语句以非锁定方式执行,但可能会使用行的早期版本。因此,使用此隔离级别,此类读取是不一致的。当您说不一致时,它意味着最近更改了记录,即。不会读取当前正在处理的 DML 事务。我认为在你的情况下这是可以接受的。这也称为“脏读”。否则,此隔离级别的工作方式类似于 READ COMMITTED。
如果我是你,下面的顺序就是我遵循的。
检查数据库服务器的非高峰时间以及您介意选择的表。通过这个输出文件读/写,IO 对服务器来说应该不会花费太多。
在服务器后台手动运行它。并持续监控服务器健康状况。
Run Code Online (Sandbox Code Playgroud)$ cat bg_loaddata.sh mysql -uroot -p*** << EOF use db; SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; SELECT COLA, COLB into outfile '/tmp/data.csv' from TABLE_NAME; COMMIT; exit; EOF $ nohup ./bg_loaddata.sh > bg_loaddata.log &
show processlist
;您可能会等待一段时间,但如果它导致严重的动荡,那么继续并为您的进程列表中的连接 ID 终止select ...into outfile ...
[我 99% 确定这不会发生,但始终为任何回火做好准备]通过这种方式,您可以确保检索 N 条记录需要 N 秒,并且这样做不会遇到任何问题。并且每当您下次需要运行此脚本时,请将脚本放入 cron 中并睡个好觉。:) [当然你有监控指标来唤醒你]-> 只是在有人用新闻让你感到惊讶之前意识到这一点。
祝一切顺利 !!
归档时间: |
|
查看次数: |
2168 次 |
最近记录: |