Как мне псевдоним базы данных в MySQL? - PullRequest
16 голосов
/ 20 августа 2009

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

Если есть лучший способ сделать это, пожалуйста, дайте мне знать.

Ответы [ 4 ]

8 голосов
/ 20 августа 2009

https://dev.mysql.com/doc/refman/5.7/en/symbolic-links-to-databases.html говорит

MySQL не поддерживает привязку одного каталога к нескольким базам данных.

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

$ cd /var/lib/mysql
$ ln -s /other/dir/mydatabase .

Но вы не можете использовать символические ссылки, чтобы сделать один каталог базы данных «псевдонимом» для другой базы данных MySQL:

$ cd /var/lib/mysql
$ ln -s `pwd`/mydatabase1 mydatabase2  # WRONG

Причина в том, что InnoDB сохраняет имена баз данных и другие метаданные в своем собственном словаре данных, хранящемся в файле табличного пространства. Если вы запутаете это, вы не получите то, что хотите.

MySQL не имеет синтаксиса DDL для псевдонимов базы данных.

2 голосов
/ 18 сентября 2009

INNODB не будет работать с символическими ссылками файловой системы.

0 голосов
/ 27 марта 2019

Используйте код, указанный ниже, для создания синонимов.

Самый простой способ сделать это, который будет работать на всех механизмах хранения (например, InnoDB, MyISAM и т. Д.), - это использовать «Синоним» для всего доступа к базе данных.

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

ПРИМЕЧАНИЯ: Вы должны удалить «sys». из "sys.quote_identifier" (должен быть просто "quote_identifier") в "create_synonym_db.sql".

Код:

Для использования:

Это создаст подходящую схему доступа для 'CURRENT_DB', которая разрешит все стандартные функции SQL через ссылку 'FAKE-DB_NAME'.

CALL create_synonym_db('CURRENT_DB', 'FAKE_DB_NAME');

Удалить синоним:

Это удалит синоним, но не удалит исходную базу данных (протестировано на Maria 10.10.0 Series).

DROP DATABASE FAKE_DB_NAME;

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

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

(1) Создать синоним:

CALL create_synonym_db('NormalDB', 'FAKE_DB_NAME');

(2) Использовать базу данных как обычно по синониму:

  • Весь код SQL, ссылающийся на базу данных по «FAKE_DB_NAME»

(3) Создайте временную / резервную копию / замену БД любыми выбранными вами методами.

(4) Переключить код SQL всех уровней приложений на Temp DB

DROP DATABASE FAKE_DB_NAME;
CALL create_synonym_db('TempDB', 'FAKE_DB_NAME');

(5) Выполните любое запланированное техническое обслуживание на «NormalDB»

(6) Переключение кода SQL всех приложений на временную базу данных

Эти две транзакции должны быть почти мгновенными.

DROP DATABASE FAKE_DB_NAME;
CALL create_synonym_db('NormalDB', 'FAKE_DB_NAME');

Это позволит вам беспрепятственно менять любую базу данных без изменения кода на уровне приложения.

* 1078. ) для поддержания.

0 голосов
/ 24 августа 2015

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

shell> mkdir /dr1/databases/test
shell> ln -s /dr1/databases/test /path/to/datadir

MySQL не поддерживает привязку одного каталога к нескольким базам данных. Замена каталога базы данных символической ссылкой работает до тех пор, пока вы не создадите символическую ссылку между базами данных. Предположим, что у вас есть база данных db1 в каталоге данных MySQL, а затем создайте символическую ссылку db2, которая указывает на db1:

shell> cd /path/to/datadir
shell> ln -s db1 db2

В результате или любая таблица tbl_a в db1 также представляется таблицей tbl_a в db2. Если один клиент обновляет db1.tbl_a, а другой клиент обновляет db2.tbl_a, могут возникнуть проблемы.

Чтобы определить местоположение вашего каталога данных, используйте это утверждение:

SHOW VARIABLES LIKE 'datadir';

Источник: http://dev.mysql.com/doc/refman/5.1/en/symbolic-links.html

Пример Ubuntu / Debian

Предупреждение: не работает с MyISAM таблицами

1) Определите местоположение вашего каталога данных:

echo "SHOW VARIABLES LIKE 'datadir';" | mysql -u root -p

2) Перейдите в каталог с данными и остановите mysql сервис:

sudo su
service mysql stop
cd path/to/datadir

3) Создать программную ссылку:

ln -s current_db db_alias

4) Исправить разрешения:

chown -R mysql:mysql db_alias

5) Старт mysql:

service mysql start
...