【发布时间】:2011-01-28 19:05:23
【问题描述】:
我的提供程序安装到我的站点 Drupal CMS。现在我需要从旧站点复制所有数据。我的旧数据库中有没有前缀的表,但在新数据库中,所有表都有 dp_[table_name] 前缀。
【问题讨论】:
我的提供程序安装到我的站点 Drupal CMS。现在我需要从旧站点复制所有数据。我的旧数据库中有没有前缀的表,但在新数据库中,所有表都有 dp_[table_name] 前缀。
【问题讨论】:
SET @database = "Database-Name-Here";
SET @old_prefix = "wp_";
SET @new_prefix = "ab_";
SELECT
CONCAT(
"RENAME TABLE ",
@database,
".",
TABLE_NAME,
" TO ",
@database,
".",
CONCAT(@new_prefix, TRIM(LEADING @old_prefix FROM TABLE_NAME)),
';'
) AS "SQL" FROM information_schema.TABLES WHERE TABLE_SCHEMA = @database;
将 "Database-Name-Here" 替换为您的数据库名称,将 "wp_" 替换为旧前缀,以及 "ab_" 带有新的前缀。 前面的代码会产生对 MySQL DB 的查询,同样,上面代码创建的查询用单引号括起来,必须替换。但是,如果您使用的是 WordPress,则需要执行更多步骤,否则您的网站将被破坏。在上述代码创建的查询之后,必须执行以下查询。
update NEWPREFIX_usermeta set meta_key = 'NEWPREFIX_capabilities' where meta_key = 'OLDPREFIX_capabilities';
update NEWPREFIX_usermeta set meta_key = 'NEWPREFIX_user_level' where meta_key = 'OLDPREFIX_user_level';
update NEWPREFIX_usermeta set meta_key = 'NEWPREFIX_autosave_draft_ids' where meta_key = 'OLDPREFIX_autosave_draft_ids';
update NEWPREFIX_options set option_name = 'NEWPREFIX_user_roles' where option_name = 'OLDPREFIX_user_roles'
将 "NEWPREFIX" 替换为新前缀,"OLDPREFIX" 替换为旧前缀。
【讨论】:
只是稍微修改了一下,以解决前缀也在表名中的情况。
SET @database = "database_name";
SET @old_prefix = "old_prefix_";
SET @new_prefix = "new_prefix_";
SELECT
CONCAT(
"RENAME TABLE ",
TABLE_NAME,
" TO ",
CONCAT(@new_prefix, TRIM(LEADING @old_prefix FROM TABLE_NAME)),
';'
) AS "SQL" FROM information_schema.TABLES WHERE TABLE_SCHEMA = @database;
【讨论】:
如果有人想知道如何做到这一点(因为它对我的其他选项不起作用),您可以运行它(当然,将前三个变量更改为您的值):
SET @database = "database_name";
SET @old_prefix = "old_prefix_";
SET @new_prefix = "new_prefix_";
SELECT
concat(
"RENAME TABLE ",
TABLE_NAME,
" TO ",
replace(TABLE_NAME, @old_prefix, @new_prefix),
';'
) AS "SQL" FROM information_schema.TABLES WHERE TABLE_SCHEMA = @database;
然后会提示您进行一系列查询,以便更改数据库中的所有表。你只需要复制它,运行它,瞧!
【讨论】:
PhpMyAdmin 允许您现在执行此操作。在“数据库”级别选择结构选项卡以查看所有表。单击“检查所有”(在表格列表下方)。在“With selected”下拉菜单中选择:“Replace table prefix”。
【讨论】:
zerkms 解决方案对我不起作用。我必须指定information_schema 数据库才能查询Tables 表。
SELECT
CONCAT('RENAME TABLE ', GROUP_CONCAT('`', TABLE_SCHEMA, '`.`', TABLE_NAME, '` TO `', TABLE_SCHEMA, '`.`prefix_', TABLE_NAME, '`')) AS q
FROM
`information_schema`.`Tables` WHERE TABLE_SCHEMA='test';
编辑:
优化查询,只调用一次 RENAME TABLE。我遇到的事实是,连接的输出被截断为 341 个字符。这可以通过将 MySQL 变量 group_concat_max_len 设置为更高的值来解决(如果您的服务器允许):
SET group_concat_max_len = 3072; -- UTF8 assumes each character will take 3 bytes, so 3072/3 = 1024 characters.
【讨论】:
information_schema.Tables 并设置 SET group_concat_max_len = 10240;就我而言,因为有很多桌子。 +1
SELECT CONCAT('RENAME TABLE ',TABLE_NAME,' TO backup_db.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'testbot';
group_concat_max_len 变量的编辑非常重要!我也没有得到完整的句子,效果很好!
编写一个脚本,为每个表运行 RENAME TABLE。
SELECT
GROUP_CONCAT('RENAME TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` TO `', TABLE_SCHEMA, '`.`prefix_', TABLE_NAME, '`;' SEPARATOR ' ')
FROM
`TABLES` WHERE `TABLE_SCHEMA` = "test";
其中“test”是预期的数据库名称
在此之后,您可以进行长查询,如果您执行它将添加前缀;-)
【讨论】:
您可以简单地转储数据库,使用文本编辑器打开转储,将所有出现的“CREATE TABLE”替换为“CREATE TABLE dp_”并恢复数据库。这需要几分钟的时间。
【讨论】: