Как я могу использовать базу данных в MySQL?

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

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

Ответы

Ответ 1

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

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

Ответ 3

В 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

Ответ 4

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

Самый простой способ сделать это, который будет работать на всех механизмах хранения (например, 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 уровня приложения на временную базу данных

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');

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

ВАЖНО: имейте в виду, что когда вы "переключаетесь" на "TempDB", любые внесенные в него изменения не будут находиться в "NormalDB", которую вы фактически перевели в "автономный режим" (из уровня приложения) для обслуживания.