Давным-давно в системе далеко-далеко ...
Попытка перенести базу данных из 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 Fairy .
perl Makefile.PL
sudo make install
sudo apt-get install perl-doc
(странно, это не называется perldoc
)
perldoc SQL::Translator::Manual
Извлечение DDL, удобного для PostgreSQL, и всех данных 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
(переключиться на него)
- Нажмите Выполнить произвольные SQL-запросы Значок
- Открыть
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 начнёт перечислять с индекса последней вставленной строки (и не будет конфликтовать с существующим первичным ключом из последовательности)?
- Как вы обеспечиваете имя схемы при преобразовании данных из MySQL в PostgreSQL-вставки?
Ресурсы
Достаточно немного информации было необходимо, чтобы получить это далеко:
Спасибо!