Переименовать базу данных MySQL

Я создал базу данных с именем hrms, Теперь мне нужно изменить имя базы данных на sunhrm, Но, это отключено в рабочей среде MySQL. Могу ли я сделать это на самом сервере Linux?

12 ответов

Решение

Я не думаю, что вы можете сделать это. Я думаю, вам нужно вывести эту базу данных, создать новую и затем импортировать дамп.

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

Если вы хотите увидеть команды для этого, у @jan есть подробности.

Если вам нужно сделать это из командной строки, просто скопируйте, адаптируйте и вставьте этот фрагмент:

mysql -e "CREATE DATABASE \`new_database\`;"
for table in `mysql -B -N -e "SHOW TABLES;" old_database`
do 
  mysql -e "RENAME TABLE \`old_database\`.\`$table\` to \`new_database\`.\`$table\`"
done
mysql -e "DROP DATABASE \`old_database\`;"

Вы можете создать новую базу данных точно так же, как существовала предыдущая, а затем удалить старую базу данных, когда закончите. Используйте инструмент mysqldump для создания резервной копии базы данных.sql через mysqldump orig_db > orig_db.sql или если вам нужно использовать имя пользователя и пароль, запустите mysqldump -u root -p orig_db > orig_db.sql, orig_db - это имя базы данных, которую вы хотите "переименовать", root - это пользователь, под которым вы входите, а orig_db.sql - файл, созданный с резервной копией. Теперь создайте новую пустую базу данных с именем, которое вы хотите для базы данных. Например, mysql -u root -p -e "create database new_db", Как только это будет сделано, запустите mysql -u root -p new_db < orig_db.sql, new_db теперь существует как идеальная копия orig_db. Затем вы можете удалить исходную базу данных, поскольку она уже существует в новой базе данных с нужным именем базы данных.

Короткие, быстрые шаги без всего вышеприведенного объяснения:

  1. mysqldump -u root -p original_database > original_database.sql
  2. mysql -u root -p -e "create database my_new_database"
  3. mysql -u root -p my_new_database < original_database.sql
  4. mysql -u root -p -e drop database originl_database

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

Можно скопировать базу данных с помощью команды mysqldump без сохранения дампа в файл:

  1. mysql -u root -p -e "create database my_new_database"
  2. mysqldump -u root -p original_database | mysql -u root -p my_new_database
  3. mysql -u root -p -e "drop database original_database"

Вы можете сделать это с помощью оператора RENAME для каждой таблицы в вашем "current_db" после создания новой схемы "other_db"

RENAME TABLE current_db.tbl_name TO other_db.tbl_name

Синтаксис таблицы переименования источника

Ну есть 2 способа:

Метод 1: Хорошо известный метод для переименования схемы базы данных - выгрузка схемы с помощью Mysqldump и восстановление ее в другой схеме, а затем удаление старой схемы (если необходимо).

От Shell

 mysqldump emp > emp.out
 mysql -e "CREATE DATABASE employees;"
 mysql employees < emp.out 
 mysql -e "DROP DATABASE emp;"

Хотя описанный выше метод прост, он требует много времени и пространства. Что делать, если схема больше 100 ГБ? Существуют методы, в которых вы можете объединить вышеперечисленные команды вместе, чтобы сэкономить место, однако это не сэкономит время.

Чтобы исправить такие ситуации, существует другой быстрый способ переименования схем, однако, при этом необходимо соблюдать осторожность.

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

  1. Создайте новую схему базы данных с нужным именем.
  2. Переименуйте таблицы из старой схемы в новую, используя команду MySQL "RENAME TABLE".
  3. Удалите старую схему базы данных.

Если есть views, triggers, functions, stored procedures в схеме их тоже нужно будет воссоздать. "RENAME TABLE" MySQL завершается ошибкой, если в таблицах существуют триггеры. Чтобы исправить это, мы можем сделать следующие вещи:

1) Dump the triggers, events and stored routines in a separate file. Это делается с помощью флагов -E, -R (в дополнение к -t -d, который выводит триггеры) в команду mysqldump. После сброса триггеров нам нужно будет удалить их из схемы, чтобы команда RENAME TABLE работала.

  $ mysqldump <old_schema_name> -d -t -R -E > stored_routines_triggers_events.out

2) Сформировать список только "базовых" таблиц. Их можно найти с помощью запроса к таблице information_schema.TABLES.

 mysql> select TABLE_NAME from information_schema.tables where 
    table_schema='<old_schema_name>' and TABLE_TYPE='BASE TABLE';

3) Дамп представления в выходной файл. Представления могут быть найдены с помощью запроса к той же таблице information_schema.TABLES.

mysql> select TABLE_NAME from information_schema.tables where 
   table_schema='<old_schema_name>' and TABLE_TYPE='VIEW';
 $ mysqldump <database> <view1> <view2> … > views.out

4) Отбросьте триггеры на текущих таблицах в old_schema.

mysql> DROP TRIGGER <trigger_name>;
...

5) Восстановите вышеуказанные файлы дампа, как только все "базовые" таблицы, найденные на шаге №2, будут переименованы.

mysql> RENAME TABLE <old_schema>.table_name TO <new_schema>.table_name;
...
$ mysql <new_schema> < views.out
$ mysql <new_schema> < stored_routines_triggers_events.out

Сложности с вышеуказанными методами: нам может потребоваться обновить GRANTS для пользователей, которые соответствуют правильному имени схемы. Это можно исправить с помощью простого UPDATE на mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db таблицы обновления old_schema name в new_schema и вызывая "Сбросить привилегии"; Хотя "method 2″ Кажется немного сложнее, чем "method 1″, Это полностью сценарий. Простой скрипт bash для выполнения вышеуказанных шагов в правильной последовательности может помочь вам сэкономить место и время при переименовании схем базы данных в следующий раз.

Команда Percona Remote DBA написала скрипт под названием "rename_db", который работает следующим образом:

[root@dba~]# /tmp/rename_db
rename_db <server> <database> <new_database>

Чтобы продемонстрировать использование этого скрипта, использовали образец схемы "emp", создали триггеры тестирования, сохранили подпрограммы в этой схеме. Попытка переименовать схему базы данных с помощью сценария, который занимает несколько секунд, в отличие от трудоемкого метода дампа / восстановления.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| emp                |
| mysql              |
| performance_schema |
| test               |
+--------------------+


[root@dba ~]# time /tmp/rename_db localhost emp emp_test
create database emp_test DEFAULT CHARACTER SET latin1
drop trigger salary_trigger
rename table emp.__emp_new to emp_test.__emp_new
rename table emp._emp_new to emp_test._emp_new
rename table emp.departments to emp_test.departments
rename table emp.dept to emp_test.dept
rename table emp.dept_emp to emp_test.dept_emp
rename table emp.dept_manager to emp_test.dept_manager
rename table emp.emp to emp_test.emp
rename table emp.employees to emp_test.employees
rename table emp.salaries_temp to emp_test.salaries_temp
rename table emp.titles to emp_test.titles
loading views
loading triggers, routines and events
Dropping database emp

real    0m0.643s
user    0m0.053s
sys     0m0.131s



mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| emp_test           |
| mysql              |
| performance_schema |
| test               |
+--------------------+

Как видно из вышеприведенного вывода, схема базы данных "emp" была переименована в "emp_test" менее чем за секунду. Наконец, это скрипт из Percona, который используется выше для "method 2".

#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
set -e
if [ -z "$3" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h $1 -e "show databases like '$3'" -sss`
if [ -n "$db_exists" ]; then
    echo "ERROR: New database already exists $3"
    exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h $1 -e "show create database $2\G" -sss | grep ^Create | awk -F'CHARACTER SET ' '{print $2}' | awk '{print $1}'`
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
    echo "Error retrieving tables from $2"
    exit 1
fi
echo "create database $3 DEFAULT CHARACTER SET $character_set"
mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h $1 $2 -e "show triggers\G" | grep Trigger: | awk '{print $2}'`
VIEWS=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
    mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump
fi
mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
    echo "rename table $2.$TABLE to $3.$TABLE"
    mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"
done
if [ -n "$VIEWS" ]; then
    echo "loading views"
    mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
    echo "Dropping database $2"
    mysql -h $1 $2 -e "drop database $2"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then
    COLUMNS_PRIV="    UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then
    PROCS_PRIV="    UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then
    TABLES_PRIV="    UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then
    DB_PRIV="    UPDATE mysql.db set db='$3' WHERE db='$2';"
fi
if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then
    echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"
    if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi
    if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi
    if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi
    if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi
    echo "    flush privileges;"
fi

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

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

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

  3. Найдите и замените имя базы данных и сохраните файл.

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

Короче нет. Обычно считается слишком опасным переименовывать базу данных. В MySQL эта функция была немного, но она была удалена. Было бы лучше использовать рабочую среду для экспорта схемы и данных в SQL, а затем изменить имя CREATE DATABASE там, прежде чем запускать / импортировать его.

Для нетерпеливых пользователей MySQL (таких как я), решение:

/etc/init.d/mysql stop
mv /var/lib/mysql/old_database /var/lib/mysql/new_database 
/etc/init.d/mysql start

Если ваша БД содержит только таблицы MyISAM (не используйте этот метод, если у вас есть таблицы InnoDB):

  1. выключить сервер MySQL
  2. перейти к MySQL data каталог и переименуйте каталог базы данных (Примечание: не-буквенные символы должны быть закодированы особым образом)
  3. перезагрузите сервер
  4. при необходимости измените привилегии (предоставьте доступ к новому имени БД)

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

Сначала сделайте резервную копию старой базы данных под названием HRMS и отредактируйте файл сценария, заменив слово HRMS на SUNHRM. После этого шага импортируйте файл базы данных в MySQL

Другой способ переименовать базу данных или получить образ базы данных - использовать опцию обратного проектирования на вкладке базы данных. Это создаст диаграмму ERR для базы данных. Переименуйте схему там.

После этого перейдите в меню "Файл" и перейдите к экспорту и переадресации базы данных.

Затем вы можете импортировать базу данных.

Другие вопросы по тегам