xen*_*ndi 8 mysql mysqldump backup
我有一个包含近 400 万行的表。我将它导出mysqldump并通过它传输scp到另一台服务器并使用mysql命令导入它,但现在它缺少几十万行。我已经多次重复这个过程,每次都丢失了不同数量的行。
我尝试过,mysqldump --compatible=ansi因为在一次导出中,由于某种原因,语法中有错误。该转储最终拥有最多的导入行,但仍然缺少数十万行。
编辑:我尝试了 -f 选项,但在返回命令提示符之前它仍然打印出一个 mysql 错误:
ERROR 1064 (42000) at line 41458: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '286,'54.227.215.70','http://example.com/'),(81547367,'CbLc4lXH',1501560286,'54.7' at line 1
Run Code Online (Sandbox Code Playgroud)
我不确定它是否因为错误而退出,但我知道我在导入后丢失了大约一百万条记录。该文件大小为 40GB,我无法再访问以前的 mysql 服务器来进行另一次导出。我有我需要的所有数据。我只是无法将其导入。
有时,这可能是由于某些字符序列和导入时 MySQL 客户端的字符集的组合造成的。
通过执行以下操作,您可以在没有其他工具的情况下捕获此类错误
mysql -u dbuser -p -f -D thedb < importfile.sql 2>errors_encountered.txt
Run Code Online (Sandbox Code Playgroud)
这会将您的问题点记录到 errors_encountered.txt
用 mysqldump 开始可以做什么???
您可以使用--hex-blob选项将字符转换为十六进制表示。这可以缓解 MySQL 客户端程序方面的任何字符集误解或误解。
即使在MySQL 客户端使用--force时,这仍然可能导致数百或数千行未被插入。为什么 ?
默认情况下,mysqldump 已启用--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)
请注意,选项之一是--extended-insert。这会导致 mysqldump 一次以数百或数千行的块设置插入。
如果行块中只有一行存在导入问题并且您使用的是--force,则不会插入整个行块。
你如何获得一个块的所有好的部分。对于使用--extended-insert创建的 mysqldump ,没有简单的方法。发生这种情况时你能做什么?我有好消息和坏消息。
好消息:您必须使用--skip-extended-insert. 这会强制 mysqldumpINSERT为每一行创建一个。这样,在导入期间使用--force时,INSERT由于任何时候情况导致的无效不会影响周围的行。
坏消息 #1:这使得生成的 mysqldump 文件更大。
坏消息 #2:导入生成的 mysqldump 文件需要很长时间。
这是我推荐的Aug 09, 2013(从 MySQL 5.5 附件表备份/导出数据一直失败!)
要消除由此产生的大小问题,您可以执行以下操作
nohup mysqldump ... | gzip > importfile.sql.gz &
Run Code Online (Sandbox Code Playgroud)
gzip -d < importfile.sql.gz | mysql -u dbuser -p -f -D thedb
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12737 次 |
| 最近记录: |