Попытка переместить базу данных от MySQL до PostgreSQL. Вся документация я считал покрытия, в мельчайших подробностях, как переместить структуру. Я нашел очень мало документации относительно миграции данных. Схема имеет 13 таблиц (которые были перемещены успешно), и 9 ГБ данных.
Версия MySQL: 5.1.x
Версия PostgreSQL: 8.4.x
Я хочу использовать язык программирования R для анализа данных с помощью операторов выбора SQL; PostgreSQL имеет PL/R, но MySQL ничего не имеет (насколько я могу сказать).
Создайте местоположение базы данных (/var
имеет недостаточное пространство; также не любите иметь номер версии PostgreSQL везде - обновление повредило бы сценарии!):
sudo mkdir -p /home/postgres/main
sudo cp -Rp /var/lib/postgresql/8.4/main /home/postgres
sudo chown -R postgres.postgres /home/postgres
sudo chmod -R 700 /home/postgres
sudo usermod -d /home/postgres/ postgres
Вся польза к здесь. Затем, перезапустите сервер и настройте базу данных с помощью этих инструкций по установке:
sudo apt-get install postgresql pgadmin3
sudo /etc/init.d/postgresql-8.4 stop
sudo vi /etc/postgresql/8.4/main/postgresql.conf
data_directory
кому: /home/postgres/main
sudo /etc/init.d/postgresql-8.4 start
sudo -u postgres psql postgres
\password postgres
sudo -u postgres createdb climate
pgadmin3
Использовать pgadmin3
настроить базу данных и создать схему.
Эпизод продолжается в удаленной оболочке, известной как bash
, с обоими выполнениями баз данных и установкой ряда инструментов с довольно необычным логотипом: Фея SQL.
perl Makefile.PL
sudo make install
sudo apt-get install perl-doc
(странно, это не называют perldoc
)perldoc SQL::Translator::Manual
Извлеките PostgreSQL-дружественный DDL и весь MySQL
данные:
sqlt -f DBI --dsn dbi:mysql:climate --db-user user --db-password password -t PostgreSQL > climate-pg-ddl.sql
climate-pg-ddl.sql
и преобразуйте идентификаторы в нижний регистр и вставьте ссылку схемы (использование VIM): :%s/"\([A-Z_]*\)"/\L\1/g
:%s/ TABLE / TABLE climate./g
:%s/ on / on climate./g
mysqldump --skip-add-locks --complete-insert --no-create-db --no-create-info --quick --result-file="climate-my.sql" --databases climate --skip-comments -u root -p
Могло бы стоить просто переименовать таблицы и столбцы в MySQL к нижнему регистру:
select concat( 'RENAME TABLE climate.', TABLE_NAME, ' to climate.', lower(TABLE_NAME), ';' ) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='climate';
Воссоздайте структуру в PostgreSQL следующим образом:
pgadmin3
(переключитесь на него),climate-pg-ddl.sql
TABLE "
замена TABLE climate."
(вставьте имя схемы climate
)on "
замена on climate."
(вставьте имя схемы climate
)F5
выполнитьсяЭто приводит к:
Query returned successfully with no result in 122 ms.
В этой точке я озадачен.
climate-my.sql
кому: climate-pg.sql
так, чтобы они могли быть выполнены против PostgreSQL?Маленькая информация была необходима для получения настолько далеко:
Спасибо!
Обычно для таких миграций я делаю двоякое:
Затем выполните преобразование и напишите программу на любом удобном для вас языке, которая выполняет следующие действия:
Измените дизайн таблиц для PostgreSQL, чтобы воспользоваться его возможностями.
Если вы просто делаете что-то вроде использования сценария sed
для преобразования дампа SQL из одного формата в другой, все, что вы делаете, - это помещаете базу данных MySQL на сервер PostgreSQL. Вы можете это сделать, и от этого все равно будет некоторая польза, но если вы собираетесь мигрировать, выполняйте миграцию полностью.
Это потребует немного больше времени на предварительную подготовку, но я еще не сталкивался с ситуацией, когда это того не стоит.
Конвертируйте данные следующим образом (не используйте mysql2pgsql.perl ) :
Избегайте кавычек.
sed "s / \\\ '/ \' \ '/ g" clim-my.sql | sed "s / \\\ r / \ r / g" | sed "s / \\\ n / \ n / g"> escaped-my.sql
Замените USE "климат";
путем поиска и прокомментируйте комментарии:
sed " s / USE \ "климат \"; / SET search_path TO климат; / g "escaped-my.sql | sed "s / ^ \ / \ * / - /"> clim-pg.sql
Подключиться к базе данных.
sudo su - postgres
psql климат
Установите кодировку (mysqldump игнорирует свой параметр кодировки), а затем выполните сценарий.
\ encoding iso-8859-1
\ i clim-pg.sql
Эта последовательность шагов, вероятно, не будет работать для сложных баз данных со многими смешанными типами. Однако он работает для целых
s, varchar
s и float
s.
Поскольку mysqldump
включал первичные ключи при генерации операторов INSERT
, они будут превосходить автоматическую последовательность таблицы. Последовательности для всех таблиц при проверке оставались равными 1.
Использование команды ALTER SEQUENCE
установит для них любое необходимое значение.
Нет необходимости в префиксе таблиц с именем схемы. Используйте:
SET search_path TO climate;
Если вы конвертировали схему, то перенос данных будет простой частью:
дамп схемы из PostgreSQL (вы сказали, что конвертировали схему в Postgres, поэтому мы пока сделаем дамп, так как мы будем удалять и воссоздавать целевую базу данных, чтобы очистить ее):
pg_dump dbname > /tmp/dbname-schema.sql
разбиваем схему на 2 части - /tmp/dbname-schema-1.sql
, содержащий операторы создания таблиц, /tmp/dbname-schema-2.sql
- остальное. PostgreSQL требует импорта данных до импорта внешних ключей, триггеров и т.д., но после импорта определений таблиц.
воссоздать базу данных только с 1 частью схемы:
drop database dbname создать базу данных dbname \i /tmp/dbname-schema-1.sql -- теперь у нас есть таблицы без данных, триггеров, внешних ключей и т.д.
import data:
( echo 'start transaction'; mysqldump --skip-quote-names dbname | grep ^INSERT; echo 'commit' ) | psql dbname -- теперь у нас есть таблицы с данными, но без триггеров, внешних ключей и т.д.
Опция --skip-quote-names
добавлена в MySQL 5.1.3, поэтому если у вас более старая версия, то временно установите новый mysql в /tmp/mysql
(configure --prefix=/tmp/mysql && make install
должны сделать это) и используйте /tmp/mysql/bin/mysqldump
.
импортируйте остальную часть схемы:
psql dbname начать транзакцию \i /tmp/dbname-schema-2.sql commit -- мы закончили