如何将大型 SQL 数据库备份文件拆分为较小的部分而不弄乱备份查询?

如何将大型 SQL 数据库备份文件拆分为较小的部分而不弄乱备份查询?

我有一个很大的 mysql 数据库备份文件,其大小超过了 PHPMYADMIN 允许的最大值。我已经创建了数据库,现在希望将数据库导入回来,但文件太大,我无法将其作为单个文件导入。现在我知道你可以拆分文件,但我担心这可能会弄乱查询并损坏数据库。有没有办法可以将其拆分为一个查询自动结束的确切位置,以便我可以将其上传到我的实时服务器?我使用的是 Ubuntu 18.0.4 LTS 我的服务器是远程(共享托管),因此无法对配置 phpmyadmin 进行那么多控制

答案1

Emacs 是一个不错的选择。它可以打开和修改大量的 SQL 转储文件。

请记住对转储文件进行更改(尤其是大于 100 MB 的文件);可能如果您不小心,它会消耗您所有的内存(小型台式机或笔记本电脑的 RAM 和擦洗)。我说的小心,是指如果你尝试一次性删除超过 8000 行;您将占用系统内存。因为删除 8k 或 9k 行 emacs 将需要大量 RAM。在我的系统上有 16 GB RAM 和 7.5 GB 交换空间;删除 9k 行会耗尽我的所有内存(15 GB RAM 和 7.5 GB 交换空间);从而迫使操作系统(ubuntu)终止此(emacs)进程。

建议:每个字节都很重要;这意味着关闭所有不必要的东西。如果你很着急,就不要这么做。

如何正确划分转储文件

我的转储文件包含 10917 条 SQL 语句行。我想将此转储文件分成 4 个相等的部分。将其分成 4 个部分可得到大约 3000 行文件。按行号划分失败,因为所有 99% 的文件大小都集中在第一个文件中,即 132 MB,其余 2 个文件的大小为 100 到 300 kb。因此,按行数划分对我而言不起作用;因为 MySQL 转储文件在第一季度占 99%(按文件大小)。(按第一季度;我的意思是如果将转储中的总行数除以 4)。第一季度是所有创建和插入表命令,其余季度是存储过程、函数、视图和 DCL 命令。

按表划分也行不通;因为在我的例子中;我的哑文件包含大约 70 个表。但 datadir (datadir = /var/lib/mysql) 中只有 11 个表以 MB 为单位,而其他所有表都以 kbs 为单位。

强烈建议在执行任何操作之前先“另存为”,因为错误地损坏原始文件或执行操作并等待几分钟才意识到必须撤消这些步骤将是完全疯狂的。

我们将尝试根据文件大小来划分转储文件。例如,我的哑文件是 133 MB。因此,我将尝试划分三部分大小相等的文件,即 44 mb。主要关注将第一季度划分为相等的部分(例如 3),并将所有剩余的季度划分为一个文件。我们将“另存为”原始文件 3 次,然后使用 emacs 有效地将其划分为 3 个相等的部分。

1. Open the dump file in emacs

2. "Save as" the original dump file 3 times; i.e. for save as press ctrl+x and then w and then give filename_1.sql. Then second time filename_2.sql and then on third time filename_3.sql

3. Open the first file i.e. filename_1.sql. 

4. Goto line at 1K line by M-g g. (i.e. press alt plus g and then g.)
5. Usually this line might be in a middle of some SQL (DDL / DML). Choose a wise decision by going up or down, where the previous statement ended. In mine case it was in middle of a stored procedure. I opt to go till the procedure ended. Remember that line number.
6. Delete all the lines after the selection. Alt+space to start selection and then press ctrl+shift+end to select till the end. then press delete button to delete.
7. save the file i.e. ctrl+s

然后按 ctrl+x,然后按 c 退出。


从步骤 4 开始重复,保存所有剩余部分。

使用这个非常简单的过程,您可以从一个巨大的 SQL 转储中创建多个较小的转储文件。


对于windows平台,可以使用notepad++代替emacs(我还是喜欢emacs)

答案2

此解决方案仅在您创建转储文件并恢复它时才有效;例如使用 mysqldump/phpMyAdmin

我找到了另一种更简单的方法;找出哪些表最重(使用 ls);这些表通常是日志表或主表

sudo ls -Shlr /var/lib/mysql/[database_name]

顺便说一句:-S 表示按文件大小排序;h 表示方便人类阅读(不要使用 mb 等来给出文件大小(以字节为单位));l 表示长列表,r 表示列出的顺序相反,即最大的文件排在最后。

然后首先;当你使用 mysqldump 转储时,排除那些大文件(不要担心它们将包含在第二部分转储文件中。例如

第一个转储文件;除了那些大表之外的所有内容

mysqldump -h localhost -u root --password='[password]' --add-drop-database --add-drop-table --add-drop-trigger --dump-date --single-transaction --routines --events --ignore-table=[databaseName].[tableName1] --ignore-table=[databaseName].[tableName2] [databaseName] > /mnt/[path]/backup/2020/07Jul/dbName_year_month_day_all.sql

第二个转储文件;仅包含那些大表

mysqldump -h localhost -u root --password='[password]' --dump-date --single-transaction [databaseName] [tableName1] [tableName2] > /mnt/[path]/backup/2020/07Jul/dbName_year_month_day_tab1_tab2.sql

通过使用此方法,您可以获得大小大致相等(2个或更多)的较小的转储文件。这些文件可以轻松上传并在服务器上执行。

在服务器大小上,只需使用任何客户端导入那些转储文件。例如 phpMyAdmin。

仅供参考:我注意到对转储文件(即 .sql.zip 格式)使用压缩会导致服务器出现网关错误。

答案3

我使用了这个叫做SQL 转储拆分器将大文件分割成我选择的小块。该工具是跨平台的,采用 appimage 格式,这意味着它几乎可以在任何 Linux 发行版上运行。只需使其可执行并运行它(双击它)。

相关内容