Назад | Перейти на главную страницу

Создание тестовой базы данных со скопированными * и * собственными данными

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

НО, Я бы хотел иметь возможность создавать записи в тестовой базе данных и сохранять их, а не перезаписывать.

Мне интересно, есть ли простой способ сделать это.

Обе базы данных работают на одном сервере, так что, очевидно, это исключает репликацию?

Для пояснения вот что бы я хотел сделать:

  1. Тестовая база данных создана с производственными данными
  2. Я создаю несколько тестовых записей, которые хочу продолжать работать на тестовом сервере (в основном, чтобы иметь примеры записей, с которыми я могу играть)
  3. На следующий день база данных полностью обновляется, но записи, которые я создал в тот день, сохраняются. Записи, которые не были затронуты в тот день, заменяются записями из производственной базы данных.

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

Похоже, единственный способ сделать это - иметь какую-то таблицу, в которой хранятся метаданные о создаваемых записях? Так, например, примерно так:

CREATE TABLE MetaDataRecords (
    id integer not null primary key auto_increment,
    tablename varchar(100),
    action char(1),
    pk varchar(100)
);

DELETE FROM testdb.users
WHERE
    NOT EXISTS (SELECT * from proddb.users WHERE proddb.users.id=testdb.users.id) AND
    NOT EXISTS (SELECT * from testdb.MetaDataRecords 
        WHERE  
            testdb.MetaDataRecords.pk=testdb.users.pk AND
            testdb.MetaDataRecords.action='C' AND
            testdb.MetaDataRecords.tablename='users'
    );

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

Все, что я сделал, было просто:

  • mysqldump Производство
  • Ввести SQL в конец дампа и assert он находится в файле (никогда нельзя быть слишком осторожным с записью файлов)
  • Восстановите эту резервную копию в тестовой базе данных.

Вводимый вами SQL-код следует поддерживать отдельно, возможно, в другом скрипте. Их обычно называют испытательные приспособления. Чтобы абстрагироваться от реализации вашей БД и меньше полагаться на «магию» (т.е. в вашем случае, diffиспользуя вашу тестовую базу данных с ее предыдущим восстановлением, чтобы увидеть, что было добавлено, а затем увидеть, что было удалено из живого, перекрестные ссылки на первичные / внешние ключи и т.д.) настоящие пользователи, если ваши тестовые.

Одно из преимуществ (для меня) - это что-то вроде:

UPDATE users SET email = CONCAT('gmailusername+', users.name, '@gmail.com')`;

что является мега-отказоустойчивым, если все другие средства не работают (например, ваш фиктивный SMTP-сервер), и почта проскальзывает (опять же, никогда нельзя быть слишком осторожным с этими вещами).

Я думаю ты найдешь объединить таблицы здесь полезно. Просто храните тестовые данные в одной таблице; и иметь ежедневные снимки с производства в другой таблице; и есть таблица слияния этих двух.