我需要转储MySQL innodb -数据库由几个表组成。导致问题的一个表有近1300万行。重新安装XAMPP(V.3.2.2)转储过程成功后,转储过程总是失败,错误信息为"mysqldump: error 2013: Lost connection to MySQL server during query when dump tablegv_faktur_header_history
at 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";命令
我像这样重复这个过程几次:
- 重新安装xampp
- 使用此方法导入数据库
> 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;
- 转储数据库w/o——skip- extension -insert (success) ——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备份文件执行相同的过程。