Zee*_*cer 37 mysql mysqldump load-data-infile
我有一个表遍布两个运行MySql 4的服务器.我需要将这些表合并到一个服务器中以用于我们的测试环境.
这些表每个都有数百万条记录,它们在两台服务器上的原因是因为它们有多大.任何表格的改变和分页都会给我们带来太大的性能损失.
因为它们处于生产环境中,所以我不可能在现有服务器上以任何方式更改它们.
问题是主键是一个唯一的自动递增字段,因此存在交叉点.
我一直在试图弄清楚如何使用mysqldump命令来忽略某些字段,但是--disable-keys只是改变了表,而不是完全摆脱键.
在这一点上,我看起来需要修改数据库结构,以便将主键的校验和或哈希用作实际应该唯一的两个唯一字段的组合...我真的不想做这个.
救命!
lon*_*eck 25
如果你不关心auto_increment列的值是什么,那么只需加载第一个文件,重命名表,然后重新创建表并加载第二个文件.最后,使用
INSERT newly_created_table_name (all, columns, except, the, auto_increment, column)
SELECT all, columns, except, the, auto_increment, column
FROM renamed_table_name
Run Code Online (Sandbox Code Playgroud)
Eri*_*and 19
为了解决这个问题,我查了一下这个问题,找到@ pumpkinthehead的答案,并意识到我们需要做的就是找到+用NULL替换每一行中的主键,以便mysql将使用默认的auto_increment值.
(your complete mysqldump command) | sed -e "s/([0-9]*,/(NULL,/gi" > my_dump_with_no_primary_keys.sql
原始输出:
INSERT INTO `core_config_data` VALUES
(2735,'default',0,'productupdates/configuration/sender_email_identity','general'),
(2736,'default',0,'productupdates/configuration/unsubscribe','1'),
Run Code Online (Sandbox Code Playgroud)
转换输出:
INSERT INTO `core_config_data` VALUES
(NULL,'default',0,'productupdates/configuration/sender_email_identity','general'),
(NULL,'default',0,'productupdates/configuration/unsubscribe','1'),
Run Code Online (Sandbox Code Playgroud)
注意:这仍然是一个黑客; 例如,如果您的自动增量列不是第一列,它将失败,但99%的时间解决了我的问题.
jim*_*myi 11
您可以在没有主键列的情况下创建表的视图,然后在该视图上运行mysqldump.
因此,如果您的表"users"具有以下列:id,name,email
> CREATE VIEW myView AS
SELECT name, email FROM users
Run Code Online (Sandbox Code Playgroud)
编辑:啊,我明白了,我不确定是否还有其他办法.
这是总的痛苦。我通过运行类似的方法来解决这个问题
sed -e "s/([0-9]*,/(/gi" export.sql > expor2.sql
Run Code Online (Sandbox Code Playgroud)
在转储上摆脱主键,然后
sed -e "s/VALUES/(col1,col2,...etc.) VALUES/gi" LinxImport2.sql > LinxImport3.sql
Run Code Online (Sandbox Code Playgroud)
除主键外的所有列。当然,您必须要小心,([0-9]*,不要代替您真正想要的任何东西。
希望能对某人有所帮助。