префикс имен таблиц mysqldump - PullRequest
3 голосов
/ 16 декабря 2009

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

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

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

Ответы [ 7 ]

2 голосов
/ 22 марта 2010

Этот сценарий sed, возможно, немного безопаснее. Сохраните его в файл и используйте 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_ на нужный вам префикс таблицы.

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

Эта хранимая процедура получает список таблиц из таблиц памяти 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 ;
1 голос
/ 16 декабря 2009

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

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

2) Отредактируйте «старый» файл дампа:

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

3) Тогда cat dump1 dump2 > combined_dump

4) mysql < combined_dump

0 голосов
/ 01 июня 2018

Запустите следующий запрос:

SELECT Concat('ALTER TABLE ', TABLE_NAME, ' RENAME TO my_prefix_', TABLE_NAME, ';') FROM information_schema.tables WHERE table_schema = 'my_database'

Вывод которых составляет несколько запросов. Затем запустите эти запросы.

Это не будет работать, если есть ограничения или другие сложные вещи, но для простых БД это отлично работает.

0 голосов
/ 16 декабря 2009

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

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

Вот так:

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
0 голосов
/ 16 декабря 2009

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

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

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

Peer

0 голосов
/ 16 декабря 2009

Импорт их в разные базы данных. Скажем, они называются 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'
...