Дублировать базу данных mysql из mysql? - PullRequest
4 голосов
/ 21 июня 2011

Это, вероятно, длинный снимок, но .. возможно ли продублировать весь макет базы данных (таблицы, представления, процедуры, все) с запросом или несколькими запросами в хранимой процедуре?

В основном, ищемта же функциональность, как если бы я использовал mysqldump следующим образом

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

Возможно ли сделать это в процедуре mysql без каких-либо внешних инструментов?

Я думаю, я мог бы сделать таблицы с помощью 'покажите таблицы », а затем итерируйте результаты, чтобы получить статистику« создать таблицу »для каждой таблицы и переслать их в новую базу данных.
Хотя это всего лишь предположение, не знаю, как бы я скопировал хранимые процедуры из базы данныхвот так.

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

В основном нет, MYSql не имеет функции дублирования базы данных. Некоторые внешние инструменты могут, но я не знаю ни одного. Я сделал этот процесс с помощью php, но я уверен, что это можно сделать с помощью хранимых процедур или любого другого приложения среднего уровня. Вот шаги, которым я следовал на высоком уровне. Я предполагаю, что вы знаете детали того, как сделать каждый шаг.

  1. Создать новую БД
  2. Запрос ко всем таблицам этой базы данных, у меня был доступ к information_schema, поэтому я просто сделал выбор оттуда.
  3. Цикл по столам.
    1. запустите что-то вроде этого CREATE TABLE dbnew.tableA LIKE dbold.tableA Это идеально продублирует структуру таблицы
    2. Вставить Select в ваш новый db / table selection * from old db / table
  4. пообедайте или, в зависимости от размера вашей базы данных, посмотрите фильм или повторно запустите «IT-толпу»
  5. наслаждайтесь скопированной базой данных.

Поправка: в своем исследовании, сделавшем это раньше, я обнаружил, что была версия mySql, которая имела дублирующую команду базы данных, но она была глючной и была удалена в будущих версиях. Даже если вы используете версию с этой командой, вам лучше выполнить эти шаги, чем использовать эту команду.

0 голосов
/ 17 сентября 2012

Копировать таблицу у меня работает с этой процедурой (новое имя БД в качестве аргумента)

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
...