向MySQL数据库中批量导入SQL文件的方法

记得去年冬天我在咖啡厅写代码,暖气片嗡嗡作响,突然发现本地导入的SQL文件导入到远程数据库的时候卡了很久。
当我打开 SSH 窗口时,文件路径似乎使用相对路径。
由于用户权限问题,服务器找不到该文件。
我花了两个小时才改完。
我想知道是否可以有一个一键导入脚本...
mysql 命令行真的很方便。
去年我将数百个小表导入集群时,我使用cat将data.sql文件重定向到mysql并运行了一夜。
它比一次运行 INSERT 快得多。
但有一个问题。
我忘记添加 -i 选项来自动忽略重复的键。
结果发现有些表有重复的数据。
早上被测试人员骂了...
source命令方便调试。
当我调试触发器时,我逐行获取 sql 脚本。
当我看到错误时,我立即纠正它,这比复制粘贴到客户端更有效率。
但今年在做GB范围的数据迁移时,发现不加--skip-lock-tables居然锁住了所有的表,差点就搞砸了……
上传数据文件太神奇了!去年,当我导入包含 1 0 亿行的 CSV 时,比传统的 INSERT 快了整整两天。
关键是字段类型的自动匹配很麻烦,但是我这次使用MySQL 8 .0的时候,忘记添加CONCAT('', field_name, '')来恢复字段名的引号。
结果整个数据集导入都是乱码,真是让人意外……
最近用Python脚本批量导入,尤其是导入带有事务的复杂SQL时。
记得上个月使用Pandas进行批处理时,忘记添加commit参数了。
结果,数据库不断被阻塞。
后台发现未提交的事务填满了innodb重做日志。
从现在开始,您应该在进入生产环境之前添加 --simulate 检查...
Foreign_key_checks 和 wait_timeout 是救星。
去年导入任务的时候忘记改wait_timeout了。
任务中途失败,但是没有报错。
在我发现之前,数据已经丢失很长时间了。
今年换工作后,新公司的DBA强烈建议默认禁用foreign_key_checks后再导入,称这样可以节省很多时间……
监控工具也很重要。
上次看到服务器CPU高达9 0%,发现导入LOAD DATA时硬盘I/O超载。
现在使用球来实时查看它。
当我看到 CPU 峰值时,我立即停止导入并在其他时间再次运行...
最终,这取决于情况。
小文件的命令行速度很快,但对于大文件,你必须玩一些技巧。
今年我从 MySQL Workbench 学到了新的 SQL 导入。
导入速度其实比命令行还快,但是只能处理.sql,而CSV必须是LOAD DATA...
等等,我突然想到如果有一个工具可以自动判断文件大小和类型,然后根据情况自动选择方式策略,这样就容易多了……

oracle表批量插入数据

说白了,向Oracle批量插入数据有两种方式。
该脚本速度很快但很烦人,界面很简单但速度慢得离谱。

我先说最重要的事情。
使用 SQL 脚本时最好使用 INSERTALL。
去年我们跑了一个3 000级的项目,一行代码就完成了,比循环插入至少快5 倍。
另一点需要注意的是SQLLoader,它适用于非常大的数据组,例如数百万条记录。
使用流式加载可以节省大量CPU。
还有另一个关键细节。
您必须在运行脚本之前添加 EXPLAINPLAN。
去年我们出了问题,就是因为我们没有看实施计划。
结果索引没有生效,拖慢了整个插入过程。

一开始我以为PL/SQL循环插入很灵活,后来发现不对。
当数据量超过5 000条时,内存溢出很常见。
等等,还有一点,如果表有触发器的话,脚本执行会像乌龟爬一样慢,所以需要先暂时禁用它。

建议首先使用SQLLoader,但也可以尝试少量数据的接口。
不要将数据写入脚本中。
维持起来会很痛苦。