在MySQL中如何复制一个数据库?

4

这可能是一个冒险的想法,但是... 是否有可能使用查询或多个存储过程来复制整个数据库布局(表、视图、存储过程等)?

基本上,我正在寻找与使用以下命令相同的功能:

# mysqldump -u root -ppassword --no-data --routines dbname > file
  //create database copyofdbname
# mysql -u root -ppassword copyofdbname < file

不使用任何外部工具,是否有可能在mysql存储过程中完成此操作?

我想我可以通过使用“show tables”来获取表格,然后迭代结果以获取每个表格的“create table”语句,并将其转发到新数据库中。
不过这只是猜测,我不知道如何以这种方式复制数据库中的存储过程。

2个回答

3
基本上不行,MySQL没有重复数据库功能。可能有一些外部工具可以实现,但我不知道有哪些。我使用php完成了这个过程,但我相信可以使用存储过程或任何其他中间层应用程序来完成。以下是我在高级别上遵循的步骤。我假设您知道如何执行每个步骤的详细信息。
  1. 创建新的数据库
  2. 查询该数据库的所有表,我可以访问information_schema,所以我只需从那里进行选择。
  3. 循环遍历表。
    1. 运行类似于此CREATE TABLE dbnew.tableA LIKE dbold.tableA的命令,它将完美地复制表的结构
    2. Insert Select到你的新db/table,从旧的db/table选择*
  4. 吃午饭,或者根据您的数据库大小,看电影或重新观看"IT Crowd"
  5. 享受您复制的数据库。
修正:在我之前做这件事的研究中,我发现有一个版本的MySQL有一个重复数据库命令,但它存在缺陷,并在未来版本中删除。即使您正在运行带有该命令的版本,仍然最好遵循这些步骤,而不是使用该命令。

我正在尝试让这个工作起来,但有一件事情卡住了我。我无法创建一个以变量命名的数据库。'CREATE DATABASE in_dbname;'将创建一个实际名称为'in_dbname'而不是该变量的值的数据库。 - Steinthor.palsson
这个变量在mysql中吗,还是你正在使用一个中间层进行处理?(CF,PHP等) - invertedSpear
您可能想将它们作为另一个问题发布。原因有两点:1)因为您在做的事情与此问题的原始主题不同,2)除了您之外,我似乎是这个问题中唯一仍在活跃的人,而您正在涉足我没有经验的领域。我过于依赖中间层了。 - invertedSpear
除了使用 information_schema.procedures,您还需要使用 information_schema.parameters 来获取存储过程和函数的参数信息,包括返回子句。 - SteveC
视图、存储过程、触发器、约束(外键)不会被复制。 - raiserle
显示剩余4条评论

1

使用以下方法(将新数据库名称作为参数)可让我成功地复制表格。

BEGIN
    DECLARE done1 INT DEFAULT FALSE; 
    DECLARE tablename TEXT; 
    DECLARE cursortable CURSOR FOR (
        SELECT table_name
        FROM information_schema.tables
        WHERE
            table_schema='sansentinel'
        ORDER BY table_name ASC
    ); 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done1 = TRUE;
    START TRANSACTION;
    # create db
    set @createinstance := concat("CREATE DATABASE `",INSTANCENAME,"`"); 
    prepare createinstance from @createinstance; 
    execute createinstance;

    OPEN cursortable; 
    read_loop: LOOP 
            FETCH cursortable INTO tablename; 
            IF done1 THEN 
                    LEAVE read_loop; 
            END IF; 

            set @createtable := concat("CREATE TABLE `",INSTANCENAME,"`.`",tablename,"` LIKE `sansentinel`.`",tablename,"`"); 
            prepare createtable from @createtable; 
            execute createtable;
    END LOOP; 
    CLOSE cursortable;
    COMMIT;
END

1
其他的对象、视图、过程等在哪里?如果可能,提供一个更完整的答案。 - Yaroslav
视图、存储过程、触发器、约束(外键)不会被复制。 - raiserle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接