4

这可能是一个远景,但是.. 是否可以使用存储过程中的一个查询或多个查询来复制整个数据库布局(表、视图、过程、所有内容)?

基本上寻找相同的功能,就好像我会像这样使用 mysqldump

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

是否可以在没有任何外部工具的情况下在 mysql 程序中执行此操作?

我想我可以通过使用“显示表​​”来创建表,然后迭代结果以获得每个表的“创建表”状态并将它们转发到新数据库中。
这只是猜测,不知道如何以这种方式从数据库中复制存储过程。

4

2 回答 2

3

基本上没有,MYSql 没有重复数据库功能。一些外部工具可能会,但我不知道。我使用 php 完成了这个过程,但我确信它可以使用存储过程或任何其他中间层应用程序来完成。这是我在高层次上遵循​​的步骤。我假设您知道如何执行每个步骤的详细信息。

  1. 创建新数据库
  2. 查询该数据库的所有表,我可以访问 information_schema,所以我只是从那里进行了选择。
  3. 循环遍历表格。
    1. 运行这样的东西CREATE TABLE dbnew.tableA LIKE dbold.tableA它将完美地复制表的结构
    2. 将 Select 插入到新的数据库/表中,从旧的数据库/表中选择 *
  4. 吃午饭,或者,根据您的数据库大小,观看电影或重播“IT 人群”
  5. 享受您复制的数据库。

修正:在我之前做这个的研究中,我发现有一个版本的 mySql 有一个重复的数据库命令,但是它有 bug,在以后的版本中被删除了。即使您正在运行具有该命令可用的版本,您仍然最好遵循这些步骤而不是使用该命令。

于 2011-06-20T21:45:44.863 回答
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
于 2012-09-16T20:44:13.503 回答