为什么我的 MySQL 转储文件和我的 phpMyadmin 导出文件大小不同?

asa*_*din 8 mysql mysqldump backup

我希望创建一个 cron 作业来备份我的 MySQL 数据库。我正在使用这个命令:

$ mysqldump --user="User" --password="Password" -A 
    --single-transaction > /home/user/Export-`date +"%F"`.sql
Run Code Online (Sandbox Code Playgroud)

这导致 2.5 MB 的文件大小。但是,当我使用同一用户使用 phpMyAdmin 导出功能时,我得到一个 3.7 MB 的文件。

有人可以解释这些差异吗,如果我做错了什么?

Rol*_*DBA 5

免责声明:不是 PhpMyAdmin 的用户

我可以解释一下 mysqldump 的作用。当您运行 mysqldump 时,仅转储 SQL 语句中的数据。不复制索引。当 SQL 加载到另一台服务器时,索引将被重建。

这是一个例子

我运行一个查询来显示索引和数据使用情况。

这是该查询及其输出

mysql> SELECT IFNULL(B.engine,'Total') "Storage Engine",
    -> CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
    -> SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
    -> FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
    -> SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
    -> FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
    -> SUBSTR(' KMGTP',pw+1,1),'B') "Table Size" FROM
    -> (SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
    -> SUM(data_length+index_length) TSize FROM
    -> information_schema.tables WHERE table_schema NOT IN
    -> ('mysql','information_schema','performance_schema') AND
    -> engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
    -> (SELECT 2 pw) A ORDER BY TSize;
+----------------+----------------------+----------------------+----------------------+
| Storage Engine | Data Size            | Index Size           | Table Size           |
+----------------+----------------------+----------------------+----------------------+
| BLACKHOLE      |             0.000 MB |             0.000 MB |             0.000 MB |
| MEMORY         |             0.000 MB |             0.000 MB |             0.000 MB |
| FEDERATED      |             0.142 MB |             0.000 MB |             0.142 MB |
| MyISAM         |             8.049 MB |             0.368 MB |             8.417 MB |
| InnoDB         |            10.828 MB |             6.766 MB |            17.594 MB |
| Total          |            19.019 MB |             7.134 MB |            26.153 MB |
+----------------+----------------------+----------------------+----------------------+
6 rows in set (0.62 sec)

mysql>
Run Code Online (Sandbox Code Playgroud)

请注意,我的 PC 有 19.019 MB 数据和 7.134 MB。mysqldump 将仅转储 19.019 MB 的数据。不导出索引。

如果 phpmyadmin 使用 mysqldump,那么我只有一种可能的解释。mysqldump 默认使用选项 --opt。这就是 --opt 的作用

  --opt               Same as --add-drop-table, --add-locks, --create-options,
                      --quick, --extended-insert, --lock-tables, --set-charset,
                      and --disable-keys. Enabled by default, disable with
                      --skip-opt.
Run Code Online (Sandbox Code Playgroud)

如果 phpmyadmin 使用 调用 mysqldump --skip-opt,则通知--extended-insert未启用。启用后--extended-insert,将使用 插入一批行INSERT INTO。使用--skip-optor--skip-extended-insert将导致每个表中的每一行都有一个单独的INSERT INTO. 因此,这会增大 SQL 脚本的大小。随后,重新加载的时间将比平时更长。