2009-12-16 3 views
3

У меня есть две базы данных mysql, которые имеют почти ту же структуру и представляют данные одного и того же веб-приложения, но одна из них представляет текущую версию, а вторая - давно.префикс имен mysqldump mysqldump

Как создать базу данных с двумя дампами внутри, но с префиксом old_ для таблиц от первого и нового префикса для таблиц из второй базы данных?

Есть ли какие-либо опции mysqldump для настройки префикса или другого решения?

ответ

1
  1. Восстановление как базы данных, как это.
  2. Используйте следующую хранимую процедуру для перемещения всех таблиц из одного БД в другой БД после добавления префикса.
  3. После перемещения удалите исходную базу данных.

Эта хранимая процедура получает список таблиц из InMemory таблиц MySQL, в information_schema и автоматически переходит в другую БД с помощью команды RENAME.

DELIMITER $$ 

USE `db`$$ 

DROP PROCEDURE IF EXISTS `renameDbTables`$$ 

CREATE DEFINER=`db`@`%` PROCEDURE `renameDbTables`(
    IN from_db VARCHAR(20), 
    IN to_db VARCHAR(30), 
    IN to_name_prefix VARCHAR(20) 
) 
BEGIN 
/* 
call db.renameDbTables('db1','db2','db_'); 
db1.xxx will be renamed to db2.db_xxx 
*/ 
    DECLARE from_state_table VARCHAR(20) DEFAULT ''; 
    DECLARE done INT DEFAULT 0; 
    DECLARE b VARCHAR(255) DEFAULT ''; 
    DECLARE cur1 CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES 
     WHERE TABLE_SCHEMA=from_db; 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 

    OPEN cur1; 

    REPEAT 
     FETCH cur1 INTO from_state_table; 
     IF NOT done THEN 
--   select from_state_table; 
      SET @QUERY = ''; 
      SET @QUERY = CONCAT(@QUERY,'RENAME TABLE ',from_db,'.', from_state_table,' TO ',to_db,'.', to_name_prefix, from_state_table,';'); 
--   SELECT @query; 
      PREPARE s FROM @QUERY; 
      EXECUTE s; 
      DEALLOCATE PREPARE s; 
     END IF; 
    UNTIL done END REPEAT; 
    CLOSE cur1; 
    END$$ 

DELIMITER ; 
0

Импортируйте их в различные базы данных. Скажем, их называют newdb и olddb. Затем вы можете скопировать table1 в old_table1 как:

insert into newdb.old_table1 
select * 
from olddb.table1 

Если у вас есть огромное количество таблиц, создать сценарий, чтобы скопировать их:

select concat('insert into newdb.old_', table_name, 
    'select * from olddb.', table_name, ';') 
from information_schema.tables 
where table_schema = 'olddb' 
+0

Это не работает, если таблица имеет ограничения в зависимости от таблиц, которые еще не скопированы. – 2015-07-28 08:07:54

1

«Файл туздЫшпр» А просто текстовый файл полный операторов SQL, поэтому вы можете вносить быстрые изменения, подобные этим в текстовом редакторе.

1) Дамп двух баз данных по отдельности.

2) Редактирование «старый» файл дампа:

  • добавить правильную линию use mydatabase;
  • сделать поиск и замену, чтобы добавить old_ перед именами таблиц.

3) Затем cat dump1 dump2 > combined_dump

4) mysql < combined_dump

+1

+1 эти файлы могут быть очень большими, однако для внесения изменений обязательно используйте достойный текстовый редактор (например, блокнот ++). Другой альтернативой является использование флага «-no-data» для одного дампа и «-no-create-info» для второго дампа. Это даст вам меньший файл для первоначального редактирования и позволит вам убедиться, что вы создаете именно то, что хотите. УБЕДИТЕСЬ, чтобы изменить имена таблиц второго файла, иначе вы можете положить содержимое старого файла в таблицы нового файла. – aronchick

+0

@aronchick +1 на bigness. Некоторые редакторы абсолютно сбой и сжигание, когда они сталкиваются с длиной в несколько мегабайт (данные в файлах mysqldump - это огромный оператор insert, все в одной строке). – Seth

0

я сделал следующее, используя mysqldump и sed в прошлом, но я признаю, что это может быть эффективным только для одного стола на время.

$ mysqldump -u user --password=mypass MyDB MyTable | sed s/MyTable/old_Mytable/ | mysql -u other_user -p NewDB 

Вы можете создать скрипт со списком команд, по одному для каждой таблицы, или, возможно, другой пользователь имеет возможность изменить это, чтобы эффективно работать с несколькими таблицами в одном кадре.

Peer

0

I может быть непониманием проблемы, но это звучит, как вы хотите сбросить 2 базы данных в один файл SQL, которые будут использоваться для восстановления DBS, со старой таблицей собирается в одну схему и новые таблицы переходя в другой.

ЕСЛИ это то, что вы пытаетесь сделать, самый простой подход - просто вставить правильную команду «использовать базу данных» перед каждым дампом.

Как так:

echo "use old_db;" > /tmp/combined_dump.sql 
mysqldump old_db >> /tmp/combined_dump.sql 
echo "use new_db;" >> /tmp/combined_dump.sql 
mysqldump new_db >> /tmp/combined_dump.sql 
2

Это СЭД сценарий, возможно, немного безопаснее. Сохраните его в файл и используйте sed -f для фильтрации файла дампа.

s/\(-- Table structure for table `\)\([^`]\+\)\(`\)/\1xyzzy_\2\3/ 
s/\(DROP TABLE IF EXISTS `\)\([^`]\+\)\(`\)/\1xyzzy_\2\3/ 
s/\(CREATE TABLE `\)\([^`]\+\)\(` (\)/\1xyzzy_\2\3/ 
s/\(-- Dumping data for table `\)\([^`]\+\)\(`\)/\1xyzzy_\2\3/ 
s/\(\/\*!40000 ALTER TABLE `\)\([^`]\+\)\(` DISABLE KEYS \*\/\)/\1xyzzy_\2\3/ 
s/\(LOCK TABLES `\)\([^`]\+\)\(` WRITE\)/\1xyzzy_\2\3/ 
s/\(INSERT INTO `\)\([^`]\+\)\(` VALUES (\)/\1xyzzy_\2\3/ 
s/\(\/\*!40000 ALTER TABLE `\)\([^`]\+\)\(` ENABLE KEYS \*\/\)/\1xyzzy_\2\3/ 

Найти и заменить xyzzy_ с помощью нужного префикса таблицы.

+0

этого недостаточно; вы должны рассматривать ограничения – 2015-07-28 08:06:03