我的提供程序安装到我的站点 Drupal CMS。现在我需要从旧站点复制所有数据。我的旧数据库中有没有前缀的表,但在新数据库中所有表都有dp_[table_name]
前缀。
7 回答
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.
PhpMyAdmin 允许您现在执行此操作。在“数据库”级别选择结构选项卡以查看所有表。单击“检查全部”(在表格列表下方)。在“选择”下拉列表中选择:“替换表前缀”。
编写一个脚本,为每个表运行 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_”并恢复数据库。这需要几分钟的时间。
只是稍微修改了一下,以考虑前缀也在表名中的情况。
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;
然后会提示您进行一系列查询,以便更改数据库中的所有表。你只需要复制它,运行它,瞧!
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 数据库的查询,同样,上面代码创建的查询用单引号括起来,必须替换。但是,如果您正在处理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 ”替换为旧前缀。