3

我正在将旧数据库导入到我们程序的新版本中,我想知道是否有办法不从转储中导入某些列/表,并在导入其他表/列时重命名它们?我知道我可以在理论上编辑转储文件,但这似乎是一个 hack,到目前为止,我的编辑都无法处理打开 1.3 gb 文件(是的,我已经在这里阅读了关于这个问题的问题。不,到目前为止,没有一个答案对我有用。)。

建议?

4

3 回答 3

3

我会说将它导入一个临时数据库并实时进行更改 - 可能应用一个预构建的脚本来执行必要的操作:

DROP TABLE ....
DROP TABLE ....
DROP TABLE ....
ALTER TABLE ..... DROP column ....

然后将完成的结果复制到生产数据库中。

这也可以很好地自动化。

它可能比找到一个编辑转储的工具更快,问题更少(或者,经常使用这些东西,尝试五种不同的工具并发现没有一个很好用)。

于 2010-07-24T19:40:59.190 回答
3

可以通过拒绝权限来不导入某些表,并使用 --force 作为命令行选项。

无法导入某些列或重命名它们(至少无需编辑转储文件或在导入后进行修改)。

我的建议是:

  • 将表导入另一个数据库(1.3G 应该还是很快的)。
  • 做你的删除/重命名。
  • 导出数据为自己创建一个新的转储文件。

如果您担心转储包含多个数据库,mysql 命令行工具有一个 -o 标志来只导入一个。

于 2010-07-24T19:42:42.227 回答
0

假设你有两个数据库,你可以重命名 OldDB 中的所有表(只要确保前缀没有在任何表名中使用,因为重命名有一个字符串替换)......</p>

USE olddb;

DROP PROCEDURE IF EXISTS rename_tables;
DELIMITER ||
CREATE PROCEDURE rename_tables(
    IN plz_remove BOOLEAN
)
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE tab VARCHAR(64);
    DECLARE mycursor CURSOR FOR
        SELECT table_name FROM information_schema.tables
            WHERE table_schema = (SELECT DATABASE() FROM DUAL)
    ;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN mycursor;

    myloop: LOOP
        FETCH mycursor INTO tab;
        IF done THEN
            LEAVE myloop;
        END IF;

        IF plz_remove THEN
            SET @sql = CONCAT(
                'RENAME TABLE ', tab, ' TO ', REPLACE(tab, 'olddb_', '')
            );

        ELSE
            SET @sql = CONCAT('RENAME TABLE ', tab, ' TO olddb_', tab);
        END IF;

        -- construct due to RENAME × CONCAT / variables.
        PREPARE s FROM @sql;
        EXECUTE s;

    END LOOP;

    CLOSE mycursor;
END ||
DELIMITER ;

-- append 'olddb_'.
CALL rename_tables(false);

-- […]
-- rename back after dump.
CALL rename_tables(true);

…然后转储并导入NewDB。

$ mysqldump -hlocalhost -uroot -p  --complete-insert  --routines  --default-character-set=utf8  olddb > olddb.sql
$ mysql -hlocalhost -uroot -p  --default-character-set=utf8  newdb < olddb.sql

这会给你(例如):

USE newdb;
SHOW TABLES;

+------------------+
| Tables_in_newdb  |
+------------------+
| bar              |
| foo              |
| olddb_company    |
| olddb_department |
| olddb_user       |
| user             |
+------------------+

进一步阅读/基于:

于 2021-08-24T20:58:57.343 回答