Каков наилучший способ синхронизации данных между MS Access и MySQL? - PullRequest
5 голосов
/ 14 января 2009

У меня есть база данных доступа на машине с Windows, которую я должен импортировать в mysql на веб-сервере linux. На данный момент таблица базы данных access экспортируется в виде текстового файла, автоматически копируется с помощью ftp, а затем загружается в mysql.

Есть ли лучший способ сделать это, возможно, используя соединение ODBC или что-то еще?

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

База данных доступа обрабатывается другой программой, и было бы лучше, если бы мне не пришлось вносить в нее изменения или даже открывать ее. Нет необходимости импортировать обновленные записи из базы данных доступа. База данных mysql будет основным источником, а некоторые записи будут удалены или изменены. Я только хочу импортировать записи, которых никогда не было в базе данных mysql, а не восстанавливать те, которые были намеренно удалены.

Ответы [ 5 ]

3 голосов
/ 14 января 2009

Почему бы не связать таблицы через ODBC в соответствии с рекомендациями Keltia, а затем использовать серию запросов для добавления отсутствующих записей и обновления измененных записей. Запросы могут быть выполнены через VBA. ADO также будет хорошо работать с MySQL и Access.

Некоторые примечания по коду, используемому в Access:

   Set db = CurrentDb
   strSQL = "Insert INTO [ODBC;DSN=DSNName;].NameOfMySQLTable " _
   & "Select AnyField As NameOfMySQLField FROM AnyAccessTable;"

   db.Execute strSQL, dbFailOnError
   End Sub

- http://forum.lessthandot.com/viewtopic.php?f=95&t=3862

1 голос
/ 14 января 2009

Если вам нужны инкрементные обновления, вы можете написать скрипт, который подключается к обеим базам данных (по крайней мере через ODBC на стороне доступа) и сравнивает все таблицы. Преимущество копирования целиком состоит в том, что вы наверняка ничего не забудете, недостатком может быть размер и тот факт, что mysql не будет доступен во время перезагрузки.

0 голосов
/ 14 января 2009

Смотрите мой ответ в

Доступ DB5 к MySQL автоматически

0 голосов
/ 14 января 2009

Чтобы помочь переносить только изменения, я предлагаю вам добавить новую таблицу в базу данных Access, которая называется что-то вроде RecordChanges.

Структура таблицы будет выглядеть следующим образом:

RecordChangeID (int) - Primary Key (Autonumber)
TableName (varchar(250)) - Name of table that changed
RecordID (int) - ID of the record in that table that was added / modified
RecordAction (char(1)) - 'A' if add, 'M' if modified or 'D' if deleted

Примечание - добавив идентификатор пользователя и другие данные, вы можете получить хороший контрольный журнал.

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

Как только это будет сделано, я создам другую таблицу с одной записью, которая называется ExportStatus, со следующей структурой:

LastRecordChangeID (int) - ID of the last Record Change 
                           you exported in the Record Changes table

Затем создайте подпрограмму, чтобы пройти через все изменения записей со времени последнего экспорта (вы извлекаете это из таблицы ExportStatus) и сгенерировать операторы SQL для обновления базы данных MySQL, обязательно обновив таблицу ExportStatus, когда закончите. Вы можете удалить все записи RecordChange, которые были успешно экспортированы, или оставить их в качестве контрольного журнала.

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

0 голосов
/ 14 января 2009

Я бы сделал следующее:

Скопируйте все ваши данные Access в временную таблицу в MySQL, которая на мгновение станет вашим "основным" источником данных. Вы должны быть в состоянии сделать это, настроив источник данных ODBC, указывающий на MySQL, щелкнув правой кнопкой мыши таблицу Access и нажав «Экспорт».

  1. Запустите скрипт UPDATE в MySql, чтобы обновить соответствующие записи
  2. Запустите сценарий INSERT в MySql для вставить новые записи
  3. (Необязательно, в зависимости от того, это то, что вы хотите): запустить DELETE скрипт в MySql для удаления записей что не нашли в недавно импортированная таблица доступа.
  4. Бросить временную таблицу в MySql.

Все это можно сделать изнутри MS Access через связанные таблицы. Но производительность не будет такой хорошей, и для этого потребуется изменить операторы доступа, когда / если ваши таблицы MySql изменятся.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...