Как быстро переименовать базу данных MySQL (изменить имя схемы)? - PullRequest
874 голосов
/ 16 сентября 2008

Руководство MySQL на MySQL охватывает это.

Обычно я просто выкидываю базу данных и импортирую ее под новым именем. Это не вариант для очень больших баз данных. Очевидно, RENAME {DATABASE | SCHEMA} db_name TO new_db_name; совершает плохие поступки, существует только в нескольких версиях и в целом является плохой идеей .

Это должно работать с InnoDB , который хранит вещи совсем иначе, чем MyISAM .

Ответы [ 47 ]

3 голосов
/ 19 марта 2012

Ниже приведен однострочный фрагмент Bash для перемещения всех таблиц из одной схемы в другую:

history -d $((HISTCMD-1)) && mysql -udb_user -p'db_password' -Dold_schema -ABNnqre'SHOW TABLES;' | sed -e's/.*/RENAME TABLE old_schema.`&` TO new_schema.`&`;/' | mysql -udb_user -p'db_password' -Dnew_schema

Команда history в начале просто гарантирует, что команды MySQL, содержащие пароли, не будут сохранены в истории оболочки.

Убедитесь, что db_user имеет разрешения на чтение / запись / удаление в старой схеме, а также разрешения на чтение / запись / создание в новой схеме.

2 голосов
/ 06 октября 2011

Это пакетный скрипт, который я написал для переименования базы данных в Windows:

@echo off
set olddb=olddbname
set newdb=newdbname
SET count=1
SET act=mysql -uroot -e "select table_name from information_schema.tables where table_schema='%olddb%'"
mysql -uroot -e "create database %newdb%"
echo %act%
 FOR /f "tokens=*" %%G IN ('%act%') DO (
  REM echo %count%:%%G
  echo mysql -uroot -e "RENAME TABLE %olddb%.%%G to %newdb%.%%G"
  mysql -uroot -e "RENAME TABLE %olddb%.%%G to %newdb%.%%G"
  set /a count+=1
 )
mysql -uroot -e "drop database %olddb%"
2 голосов
/ 06 сентября 2012

Вы можете сделать это двумя способами.

  1. RENAME TABLE old_db.table_name TO new_db.table_name;
  2. Перейти к операции-> там вы можете увидеть вкладку Параметры таблицы. Вы можете редактировать имя таблицы там.
2 голосов
/ 12 октября 2010

Это работает для всех баз данных и работает путем переименования каждой таблицы с помощью maatkit mysql toolkit

Используйте mk-find для печати и переименования каждой таблицы. Страница man имеет много других опций и примеров

mk-find --dblike OLD_DATABASE --print --exec "RENAME TABLE %D.%N TO NEW_DATABASE.%N"

Если у вас установлен maatkit (, что очень просто ), то это самый простой способ сделать это.

2 голосов
/ 16 августа 2012

ALTER DATABASE - предложенный способ решения этой проблемы MySQL, и RENAME DATABASE отброшено.

С 13.1.32 СМЕНА БАЗЫ ПЕРЕМЕННОГО ДАННОГО :

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

Этот оператор был добавлен в MySQL 5.1.7, но он был признан опасным и был удален в MySQL 5.1.23.

1 голос
/ 21 августа 2015

Если вы используете иерархические представления (представления, извлекающие данные из других представлений), импорт необработанного вывода из mysqldump может не работать, поскольку mysqldump не заботится о правильном порядке представлений. Из-за этого я написал скрипт , который переупорядочивает представления, чтобы исправить порядок на лету.

Это выглядит так:

#!/usr/bin/env perl

use List::MoreUtils 'first_index'; #apt package liblist-moreutils-perl
use strict;
use warnings;


my $views_sql;

while (<>) {
    $views_sql .= $_ if $views_sql or index($_, 'Final view structure') != -1;
    print $_ if !$views_sql;
}

my @views_regex_result = ($views_sql =~ /(\-\- Final view structure.+?\n\-\-\n\n.+?\n\n)/msg);
my @views = (join("", @views_regex_result) =~ /\-\- Final view structure for view `(.+?)`/g);
my $new_views_section = "";
while (@views) {
    foreach my $view (@views_regex_result) {
        my $view_body = ($view =~ /\/\*.+?VIEW .+ AS (select .+)\*\/;/g )[0];
        my $found = 0;
        foreach my $view (@views) {
            if ($view_body =~ /(from|join)[ \(]+`$view`/) {
                $found = $view;
                last;
            }
        }
        if (!$found) {
            print $view;
            my $name_of_view_which_was_not_found = ($view =~ /\-\- Final view structure for view `(.+?)`/g)[0];
            my $index = first_index { $_ eq $name_of_view_which_was_not_found } @views;
            if ($index != -1) {
                splice(@views, $index, 1);
                splice(@views_regex_result, $index, 1);
            }
        }
    }
}

Использование:
mysqldump -u username -v olddatabase -p | ./mysqldump_view_reorder.pl | mysql -u username -p -D newdatabase

1 голос
/ 12 января 2013

Ни решение TodoInTx, ни адаптированное решение пользователя 757945 не работали для меня на MySQL 5.5.16, поэтому вот моя адаптированная версия:

DELIMITER //
DROP PROCEDURE IF EXISTS `rename_database`;
CREATE PROCEDURE `rename_database` (IN `old_name` VARCHAR(20), IN `new_name` VARCHAR(20))
BEGIN
  DECLARE `current_table_name` VARCHAR(20);
  DECLARE `done` INT DEFAULT 0;
  DECLARE `table_name_cursor` CURSOR FOR SELECT `table_name` FROM `information_schema`.`tables` WHERE (`table_schema` = `old_name`);
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET `done` = 1;

  SET @sql_string = CONCAT('CREATE DATABASE IF NOT EXISTS `', `new_name` , '`;');
  PREPARE `statement` FROM @sql_string;
  EXECUTE `statement`;
  DEALLOCATE PREPARE `statement`;

  OPEN `table_name_cursor`;
  REPEAT
    FETCH `table_name_cursor` INTO `current_table_name`;
    IF NOT `done` THEN

      SET @sql_string = CONCAT('RENAME TABLE `', `old_name`, '`.`', `current_table_name`, '` TO `', `new_name`, '`.`', `current_table_name`, '`;');
      PREPARE `statement` FROM @sql_string;
      EXECUTE `statement`;
      DEALLOCATE PREPARE `statement`;

    END IF;
  UNTIL `done` END REPEAT;
  CLOSE `table_name_cursor`;

  SET @sql_string =  CONCAT('DROP DATABASE `', `old_name`, '`;');
  PREPARE `statement` FROM @sql_string;
  EXECUTE `statement`;
  DEALLOCATE PREPARE `statement`;
END//
DELIMITER ;

Надеюсь, это поможет тому, кто в моей ситуации! Примечание: @sql_string задержится на сессии позже. Я не смог написать эту функцию без ее использования.

1 голос
/ 03 июля 2017

В случае, если вы начинаете с файла дампа с несколькими базами данных, вы можете выполнить sed для дампа:

sed -i -- "s|old_name_database1|new_name_database1|g" my_dump.sql
sed -i -- "s|old_name_database2|new_name_database2|g" my_dump.sql
...

Тогда импортируйте свой дамп. Просто убедитесь, что не будет конфликта имен.

1 голос
/ 11 сентября 2013

Я использовал следующий метод для переименования базы данных

  1. создать резервную копию файла, используя mysqldump или любой инструмент БД, например, heidiSQL, администратор mysql и т. Д.

  2. Откройте файл резервной копии (например, backupfile.sql) в каком-либо текстовом редакторе.

  3. Поиск и замена имени базы данных и сохранение файла.

4. Восстановить отредактированный файл sql

0 голосов
/ 20 апреля 2014

Я опубликовал это Как мне изменить имя базы данных, используя MySQL? сегодня, после нескольких дней царапин на голове и выдергивания волос. Решение заключается в простом экспорте схемы в файл .sql, открытии файла и изменении имени базы данных / схемы в разделе sql CREAT TABLE вверху. Существует три или более экземпляров, которые могут отсутствовать в верхней части страницы, если в файл сохраняются многослойные схемы. Таким способом можно отредактировать всю базу данных, но я ожидаю, что в больших базах данных это может быть довольно сложной задачей после всех случаев использования свойства таблицы или индекса.

...