Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将自动增量id列添加到大型MySQL表时出现问题 尝试1失败_Mysql_Database_Import - Fatal编程技术网

将自动增量id列添加到大型MySQL表时出现问题 尝试1失败

将自动增量id列添加到大型MySQL表时出现问题 尝试1失败,mysql,database,import,Mysql,Database,Import,我试图将一个巨大的SQL文件(包含6亿条记录&239GB)导入到一个具有不同模式的MySQL数据库中,以便获得一个具有“自动生成ID”的新列 我在Windows上使用MySQL Workbench 6.2,但在导入数千万条记录后,它总是失败,并显示错误消息“MySQL服务器已离开” 我正在使用“服务器->数据导入”功能进行导入 我试图补充 wait_timeout = 288000 max_allowed_packet = 300G 进入MySQL服务器文件夹中的my.ini,但发生了相同的错

我试图将一个巨大的SQL文件(包含6亿条记录&239GB)导入到一个具有不同模式的MySQL数据库中,以便获得一个具有“自动生成ID”的新列

我在Windows上使用MySQL Workbench 6.2,但在导入数千万条记录后,它总是失败,并显示错误消息“MySQL服务器已离开”

我正在使用“服务器->数据导入”功能进行导入

我试图补充

wait_timeout = 288000
max_allowed_packet = 300G
进入MySQL服务器文件夹中的
my.ini
,但发生了相同的错误

错误日志如下所示:

14:16:37 Restoring C:\data.sql
Running: mysql.exe --defaults-file="c:\users\***\appdata\local\temp\5\tmpcfyyxk.cnf"  --protocol=tcp --host=127.0.0.1 --user=shodan --port=8080 --default-character-set=utf8 --comments --database=test2 < "C:\\data.sql"
ERROR 2006 (HY000) at line 13776162: MySQL server has gone away

Operation failed with exitcode 1
16:25:51 Import of C:\data.sql has finished with 1 errors
14:16:37还原C:\data.sql
正在运行:mysql.exe--defaults file=“c:\users\***\appdata\local\temp\5\tmpcfyxk.cnf”--protocol=tcp--host=127.0.0.1--user=shodan--port=8080--default character set=utf8--comments--database=test2<“c:\\data.sql”
第13776162行的错误2006(HY000):MySQL服务器已消失
操作失败,exitcode为1
16:25:51导入C:\data.sql已完成,但出现1个错误
尝试2失败 如果我只是在原始表中添加一个新列,那么执行SQL查询所需的时间太长,永远不会成功


如果导入问题无法解决,有没有办法直接将自动生成ID的新列添加到大表中?

检查MySQL错误日志,查看服务器是否因某种原因崩溃并重新启动:

如果不是这样,最有可能的原因是max_allowed_数据包。您希望在服务器和客户端上都将其更改为1G。你可以这样做

  • 更改服务器上的设置:

    设置全局最大允许数据包大小=1*1024*1024*1024

  • 将--max_allowed_packet=1G添加到命令中:

    mysql.exe--默认文件=“c:\users***\appdata\local\temp\5\tmpcfyxk.cnf”--协议=tcp--max\u allowed\u packet=1G--host=127.0.0.1--user=shodan--port=8080--默认字符集=utf8--comments--database=test2<“c:\data.sql”


  • 与您一直在尝试的解决方案不同,我建议您采用以下替代方案:

  • 创建与旧表重复的新表+添加自动增量id
  • 将旧表中的数据复制到新表中,然后
  • 重命名这些表,使新表替换旧表
  • 假设您的
    current_表
    包含列
    col1 VARCHAR(255)NOT NULL
    ,该列当前用作主键,而
    col2 VARCHAR(255)NULL
    ,这只是一些其他数据

    CREATE TABLE new_table (
        id INT UNSIGNED AUTO_INCREMENT,
        col1 VARCHAR(255) NOT NULL, -- Make your old PK a simple not null column
        col2 VARCHAR(255) NULL,
        PRIMARY KEY (id), -- PK moves to the new id column
        INDEX (col1) -- Replace your old PK with an index
    ) ENGINE=InnoDB;
    
    INSERT INTO new_table (col1, col2) 
    SELECT col1, col2 
    FROM current_table;
    
    RENAME TABLE current_table TO old_table,
                 new_table TO current_table;
    

    这应该比简单地添加一个列或导入一个新的数据库更好。它还将维护当前的表结构并创建一个替换项,允许您在出现问题时进行回退。验证新表结构是否按预期工作后,可以删除旧表。如果失败,您可以删除新表并回滚到旧表。

    最好使用mysqldump&mysql命令行实用程序或

    SELECT ... INTO OUTFILE
    

    对于这样的操作。只需直接在mysql服务器上执行,而不是远程执行


    如果您只需要更改该表以添加autoinc列,请查看pt online schema change。若您不需要100%的正常运行时间,那个么只需使用经典的ALTERTABLE语句就可以做到。你只需要足够的磁盘空间。

    你在分区(包括TMP和CO)上有检查空间磁盘吗?你也可以考虑一个在线模式改变工具:PS -这也应该比你尝试过的其他东西快得多。
    LOAD DATA INFILE