使用mysqldump dump失败后, MySQL表被破坏



我需要转储MySQL innodb -数据库由几个表组成。导致问题的一个表有近1300万行。重新安装XAMPP(V.3.2.2)转储过程成功后,转储过程总是失败,错误信息为"mysqldump: error 2013: Lost connection to MySQL server during query when dump tablegv_faktur_header_historyat row: 2623629"。此时的状态是:

  • 不能插入任何值(Error 2013: Lost connection to MySQL)

  • 不能发出"检查表";命令(Error 2013: Lost connection to MySQL)

  • 不能修改此表(add column)

  • 可以从这个表中选择数据

  • 可以选择行2623629 (select * from table limit 2623629,1)

  • 可以运行"show table status";命令

我像这样重复这个过程几次:

  1. 重新安装xampp
  2. 使用此方法导入数据库
> set global net_buffer_length = 1000000; 
> set global max_allowed_packet = 1000000000; 
> SET foreign_key_checks = 0;
> SET UNIQUE_CHECKS = 0; 
> SET AUTOCOMMIT = 0; 
> use db_name; 
> source backup-file.sql SET
> foreign_key_checks = 1; 
> SET UNIQUE_CHECKS = 1; 
> SET AUTOCOMMIT = 1;
  1. 转储数据库w/o——skip- extension -insert (success)
  2. ——skip- extension -insert (failed)——skip- extension -insert (failed)

mysqldump命令:

mysqldump -u root -p --skip-extended-insert --max-allowed-packet=1G --net-buffer-length=32704 rent_scaff header_history > D:dobol

环境规范:

  • i5 8 gen
  • 内存8 GB (3 GB未使用,在任务管理器中看到)
  • SSD Storage 512G
  • mysqldump Ver 10.16 Distrib 10.1.10-MariaDB

这是my.ini配置

[client] 
# password       = your_password 
port            = 3306 
socket          = "C:/xampp/mysql/mysql.sock"
[mysqld]
port= 3306
socket = "C:/xampp/mysql/mysql.sock"
basedir = "C:/xampp/mysql" 
tmpdir = "C:/xampp/tmp" 
datadir = "C:/xampp/mysql/data"
pid_file = "mysql.pid"
key_buffer = 16M
max_allowed_packet = 1G
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
log_error = "mysql_error.log"
plugin_dir = "C:/xampp/mysql/lib/plugin/" 
server-id   = 1
innodb_data_home_dir = "C:/xampp/mysql/data"
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = "C:/xampp/mysql/data"
innodb_buffer_pool_size = 1G
innodb_additional_mem_pool_size = 2M
innodb_log_file_size = 250M
innodb_log_buffer_size = 250M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
[mysqldump]
quick
max_allowed_packet = 1G
[mysql]
no-auto-rehash
[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
enter code here
Mysql日志:
Server version: 10.1.10-MariaDB
key_buffer_size=16777216
read_buffer_size=262144
max_used_connections=2
max_threads=1001
thread_count=2
It is possible that mysqld could use up to 
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 787099 K  bytes of memory
Hope that's ok; if not, decrease some variables in the equation.
Thread pointer: 0x0x3eee2178
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
mysqld.exe!my_parameter_handler()
mysqld.exe!my_mb_ctype_mb()
mysqld.exe!??2Geometry@@SAPAXIPAX@Z()
mysqld.exe!??2Geometry@@SAPAXIPAX@Z()
mysqld.exe!?propagate_equal_fields@Item_func_expr_str_metadata@@UAEPAVItem@@PAVTHD@@ABVContext@Value_source@@PAVCOND_EQUAL@@@Z()
mysqld.exe!??2Geometry@@SAPAXIPAX@Z()
mysqld.exe!??2Geometry@@SAPAXIPAX@Z()
mysqld.exe!??2Geometry@@SAPAXIPAX@Z()
mysqld.exe!??0Alter_table_prelocking_strategy@@QAE@XZ()
mysqld.exe!?mysql_alter_table@@YA_NPAVTHD@@PAD1PAUHA_CREATE_INFO@@PAUTABLE_LIST@@PAVAlter_info@@IPAUst_order@@_N@Z()
mysqld.exe!?execute@Sql_cmd_alter_table@@UAE_NPAVTHD@@@Z()
mysqld.exe!?mysql_execute_command@@YAHPAVTHD@@@Z()
mysqld.exe!?mysql_parse@@YAXPAVTHD@@PADIPAVParser_state@@@Z()
mysqld.exe!?dispatch_command@@YA_NW4enum_server_command@@PAVTHD@@PADI@Z()
mysqld.exe!?do_command@@YA_NPAVTHD@@@Z()
mysqld.exe!?threadpool_process_request@@YAHPAVTHD@@@Z()
mysqld.exe!?tp_end@@YAXXZ()
KERNEL32.DLL!SetUserGeoName()
ntdll.dll!TpCheckTerminateWorker()
ntdll.dll!TpCallbackIndependent()
KERNEL32.DLL!BaseThreadInitThunk()
ntdll.dll!RtlGetAppContainerNamedObjectPath()
ntdll.dll!RtlGetAppContainerNamedObjectPath()
Trying to get some variables.
Some pointers may be invalid and cause the dump to abort.

请告诉我如何转储(备份)一个大数据库,至少如何安全地转储数据库,这样当进程失败时,表仍然可用。

所发生的情况是,要么是一个命令永远占用并且超时,要么是一次缓存中容纳的数据太多。

我会尝试使用一个程序,比如HeidiSQL,来做数据库备份。这将允许备份分阶段进行,而不是一个大请求。

这将是使用HeidiSQL执行此操作的示例。如果SQL服务器在第二台计算机上,或者其他您认为不同的设置,请随意将127.0.0.1替换为不同的IP地址。


您将从设置连接开始:
HeidiSQL session Manager Setup
  • 然后点击打开
  • 右键单击位于屏幕左上角的数据库
  • 点击EXPORT DATABASE AS SQL

首先我们要备份数据库的结构:

  • 点击左侧的复选框
  • 单击右侧选项卡上的SQL导出
    • 数据库→删除(未选中),创建(已选中)
    • 表→删除(未选中),创建(已选中)
    • 数据→没有数据
    • 输出→单个.sql文件
    • 文件名→单击文件夹图标,选择一个位置并将文件命名为DB_Structure.sql
  • 最后,点击Export

接下来,我们将从数据库中备份数据:

-与之前相同的步骤,在SQL导出中执行:

  • 数据库→删除(取消选中),创建(取消选中)
  • 表→删除(取消选中),创建(取消选中)
  • 数据→从无数据更改为插入
  • Max INSERT Size ->1024
  • 输出→从单个。sql文件更改为ZIP压缩的。sql文件
  • 文件名→单击文件夹图标,选择一个位置并将文件命名为DB_Data.zip
  • 最后,点击Export

这是你如何使用这些备份文件:

  • 点击名为►查询
  • 的标签
  • Ctrl+O
  • 在打开文件对话框中,导航到结构
  • 的备份SQL文件
  • 点击打开
  • 下一步,按F9运行SQL命令

完成后,对数据SQL备份文件执行相同的过程。