2011-06-20 29 views
4

這可能是一個很長的,但.. 是否有可能在存儲過程中複製整個數據庫佈局(表,視圖,過程,一切)與查詢或多個查詢?從mysql內複製一個mysql數據庫?

基本上尋找相同的功能,如果我會用mysqldump這樣

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

是否有可能做到這一點mysql的過程中無需任何外部工具?

我想我可以通過使用'show tables'來完成表格,然後迭代結果以獲得每個表格的'create table'表達式並將它們轉發到新的數據庫中。
這只是推測,但不知道如何從數據庫中這樣複製存儲過程。

回答

3

基本上不,MYSQL沒有重複的數據庫功能。一些外部工具可能,但我沒有意識到。我使用php做了這個過程,但我確定可以使用存儲過程或任何其他中間層應用程序來完成。以下是我在高層次所遵循的步驟。我假設你知道如何做每一步的細節。

  1. 創建新的數據庫
  2. 查詢所有該數據庫的表,我公司已獲得INFORMATION_SCHEMA所以我只是做了一個選擇從那裏。
  3. 循環遍歷表格。
    1. 來看這樣的事情CREATE TABLE dbnew.tableA LIKE dbold.tableA它將複製表完美
    2. 插入選擇的結構爲從舊的數據庫新的db /表選擇* /表
  4. 吃午飯,或根據您的數據庫大小,觀看電影或重新運行「IT人羣」
  5. 享受您複製的數據庫。

修訂:在我之前的研究中,我發現有一個版本的mySql有一個重複的數據庫命令,但是它在後面的版本中有問題。即使您使用可用的命令運行版本,仍然比使用該命令更符合以下步驟。

+0

看起來不錯,我不知道複製的表會如此簡單。以爲我必須得到'SHOW CREATE TABLE tblname'並且讓一些東西變得很糟糕。但是如何將存儲過程從舊數據庫複製到新數據庫?它們是存儲在信息模式表中的什麼東西。 –

+0

不是存儲過程方面的專家,但是如果您有權訪問信息模式,它看起來像存儲在「例程」表中。所以你應該能夠查詢它們,循環結果,併爲該循環中的新數據庫創建語句。 – invertedSpear

+0

我試圖讓這個工作,但我堅持一件事。我無法創建一個從變量命名的數據庫。 'CREATE DATABASE in_dbname;'將創建一個實際名爲'in_dbname'的數據庫,而不是該變量的值。 –

0

複製表工作對我來說這個過程(新的數據庫名作爲參數)

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

+0

視圖,存儲過程,觸發器,約束(外鍵)不會複製。 – raiserle

相關問題