Как сделать резервную копию базы данных MySQL программным путем с помощью mysql-backup4j

1656650534 kak sdelat rezervnuyu kopiyu bazy dannyh mysql programmnym putem s

от Seun Matt

S-HbFqVU37hxEprLvEnqQoF1ddrV9tNUsbvN

В этой статье мы рассмотрим mysql-backup4j, очень гибкую библиотеку Java, которую можно использовать для периодического резервного копирования нашей базы данных.

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

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

2. Установление зависимостей

Давайте добавим зависимость к нашему проекту pom.xml:

<dependency>   <groupId>com.smattme</groupId>   <artifactId>mysql-backup4j</artifactId>   <version>1.0.1</version></dependency>

Последнюю версию можно найти здесь.

3. Программный экспорт базы данных MySQL

Программный экспорт базы данных MySQL очень прост с помощью mysql-backup4j. Нам нужно только создать его экземпляр и передать ему Java Свойства объект, имеющий правильный набор свойств конфигурации:

//required properties for exporting of db Properties properties = new Properties(); properties.setProperty(MysqlExportService.DB_NAME, "database-name"); properties.setProperty(MysqlExportService.DB_USERNAME, "root"); properties.setProperty(MysqlExportService.DB_PASSWORD, "root"); 
//properties relating to email config properties.setProperty(MysqlExportService.EMAIL_HOST, "smtp.mailtrap.io"); properties.setProperty(MysqlExportService.EMAIL_PORT, "25"); properties.setProperty(MysqlExportService.EMAIL_USERNAME, "mailtrap-username"); properties.setProperty(MysqlExportService.EMAIL_PASSWORD, "mailtrap-password");properties.setProperty(MysqlExportService.EMAIL_FROM, "test@smattme.com"); properties.setProperty(MysqlExportService.EMAIL_TO, "backup@smattme.com"); 
//set the outputs temp dir properties.setProperty(MysqlExportService.TEMP_DIR, new File("external").getPath()); 
MysqlExportService mysqlExportService = new MysqlExportService(properties); mysqlExportService.export();

Из приведенного выше фрагмента мы создали новый Свойства затем добавил необходимые свойства для подключения к базе данных, а именно: имя базы данных, имя пользователя и пароль.

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

На этом шаге библиотека может экспортировать нашу базу данных и сделать zip-файл, содержащий файл дампа SQL. Файл называется в формате:

randomstring_day_month_year_hour_minute_seconds_database_name_dump.zip

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

Другая важная конфигурация, которую мы установили, это TEMP_DIR; это каталог, который будет использоваться библиотекой для временного хранения сгенерированных файлов при обработке. Это реж должно быть доступно для записи запущенной программой.

The TEMP_DIR будет автоматически удален после завершения операции резервного копирования. Сладко и просто, не правда ли? Да.

4. Отправка сгенерированного архива в любое облачное хранилище

Хотя библиотека может отправлять резервную копию на предварительно настроенный адрес электронной почты, она также дает нам возможность получить сгенерированный файл как Java Файл объект, чтобы мы могли делать с ним все, что мы хотим.

Чтобы достичь этого, мы должны добавить это свойство конфигурации:

//... properties.setProperty(MysqlExportService.PRESERVE_GENERATED_ZIP, "true");

Это свойство указывает mysql-backup4j чтобы сохранить сгенерированный zip-файл, чтобы мы могли получить к нему доступ:

File file = mysqlExportService.getGeneratedZipFile();

Теперь, когда у нас есть файловый объект, мы можем скачать его в любое облачное хранилище по нашему выбору с помощью соответствующих SDK и библиотек.

Когда мы закончим, нам нужно вручную очистить zip-файл из TEMP_DIR позвонив по телефону:

mysqlExportService.clearTempFiles(false);

Этот аспект очень важен, поэтому у нас нет лишних файлов в нашем локальном хранилище. Если мы хотим получить необработанный экспортируемый дамп SQL как строку, нам нужно только вызвать этот метод:

String generatedSql = mysqlExportService.getGeneratedSql();

Мне нравится гибкость библиотеки. Другие свойства, которые можно установить:

properties.setProperty(MysqlExportService.DELETE_EXISTING_DATA, "true"); properties.setProperty(MysqlExportService.DROP_TABLES, "true");properties.setProperty(MysqlExportService.ADD_IF_NOT_EXISTS, "true"); properties.setProperty(MysqlExportService.JDBC_DRIVER_NAME, "root.ss");properties.setProperty(MysqlExportService.JDBC_CONNECTION_STRING, "jdbc:mysql://localhost:3306/database-name");

DELETE_EXISTING_DATA добавит a УДАЛИТЬ * Из таблицы Оператор SQL перед an INSERT INTO таблица Оператор(ы) SQL.

DROP_TABLES добавит a ОТПУСТИТЬ ТАБЛИЦУ, ЕСЛИ Существующую Оператор SQL раньше СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ ЕЕ НЕ СУЩЕСТВУЕТ заявление.

ADD_IF_NOT_EXISTS что есть по умолчанию правда добавит ЕСЛИ НЕ СУЩЕСТВУЕТ пункт к СОЗДАТЬ ТАБЛИЦУ заявления.

Мы можем указать JDBC_DRIVER_NAME и JDBC_CONNECTION_STRING также из-за свойств.

Если наша база данных работает на другом хосте или порту, кроме локальный хост: 3306 тогда мы можем использовать свойство JDBC_CONNECTION_STRING для настройки подключения. DB_NAME будет извлечено из предоставленной строки подключения.

Мы можем автоматизировать этот процесс с помощью планировщиков задач Java, таких как quartz или другими средствами. Кроме того, в типичной веб-программе мы можем просто создать для нее путь, который запустит процесс резервного копирования в a Обслуживание или a Контроллер.

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

5. Импорт дампа базы данных

Да! Мы смогли создать резервную копию нашей базы данных и заблокировать ее в безопасном хранилище. Но как нам импортировать базу данных и выполнить обновление?

Во-первых, мы должны распаковать сгенерированный zip-файл и распаковать дамп SQL в папку. Тогда мы можем использовать клиенты базы данных, такие как HeidiSQL и Adminer для импорта базы данных. Использование клиента менеджера базы данных предоставит наглядную помощь и другие замечательные инструменты, поставляемые с ним.

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

Все, что нам нужно сделать, это прочитать содержимое созданного дампа SQL как строку и передать его в MySqlImportService библиотеки с минимальными конфигурациями:

String sql = new String(Files.readAllBytes(Paths.get("path/to/sql/dump/file.sql")));
boolean res = MysqlImportService.builder() .setDatabase("database-name") .setSqlString(sql).setUsername("root") .setPassword("root") .setDeleteExisting(true).setDropExisting(true) .importDatabase(); 
assertTrue(res);

Из приведенного выше фрагмента мы читаем SQL из файловой системы, а затем используем MySqlImportService для выполнения операции импорта

Мы настроили MySqlImportService чтобы удалить любое содержимое в таблице и удалить существующие таблицы. Мы всегда можем точно настроить эти параметры в соответствии с нашими потребностями. Служба вернет true в случае успешной операции или false в противном случае.

Что делать, если наша база данных работает на другом сервере и порте, отличном от localhost:3306? Мы также можем настроить это с помощью setJdbcConnString() метод.

Хотя мы читаем файл SQL из локальной файловой системы, если мы работаем в веб-интерфейсе, мы можем предоставить интерфейс, позволяющий выбрать файл из файловой системы. Затем содержимое можно будет прочитать и отправить в качестве запроса HTTP POST на сервер.

6. Заключение

Вау! Это какой-то инструмент производительности, который мы только что рассмотрели. Не забудьте пометить звездочкой mysql-backup4j на Github, если вам это понравилось.

Теперь используйте это в вашем проекте. Вопрос? Вклады? Благодарность? Пожалуйста, оставьте их в разделе комментариев ниже.

Читайте мои другие технические публикации и взгляды на жизнь https://smattme.com

Если вы считаете эту публикацию полезной, хотя бы чему-то научились, аплодируйте этой статье и поделитесь с друзьями в Facebook и Twitter. Гордитесь качественным содержимым, которое вы читаете.

Первоначально опубликовано на smattme.com.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *