Страница 1 из 1
Репликация дампа базы данных sql
Добавлено: 07 фев 2025, 15:23
ya
Создание дампа sql
Код: Выделить всё
#!/bin/bash
dirsql1=~/html/ha0.sys/sql
dirsql2=~/html/ha1.sys/
filename1=$(date +%Y.%m.%d_%H-%M-%S).sys.sql
rm -fr ${dirsql1}/*.sql.zip
mysqldump --replace --skip-add-locks --skip-add-drop-table --skip-comments --no-create-db --databases база_данных -e | sed 's/^CREATE TABLE /CREATE TABLE IF NOT EXISTS /' > ${filename1}
zip -9 -r ${filename1}.zip ${filename1}
rm -fr ${filename1}
mv ${filename1}.zip ${dirsql1}
chown gt:users ${dirsql1}/${filename1}.zip
sshpass -p 'пароль' rsync --progress -ae "ssh -p 22" ${dirsql1} логин@хост:${dirsql2}
exit 0
Импорт дампа sql
Код: Выделить всё
#!/bin/bash
# Проверяем, был ли передан параметр (имя архивного файла)
if [ $# -eq 0 ]; then
echo "Error: No archive file provided"
exit 1
fi
# Считываем имя архивного файла из параметра
ARCHIVE_FILE=$1
# Разархивируем и импортируем
unzip -p "$ARCHIVE_FILE" | mysql -u пользователь_бд -p'пароль' база_данных
exit 0
Re: Репликация дампа базы данных sql
Добавлено: 07 фев 2025, 15:35
ya
PowerShell (Windows)
Код: Выделить всё
# Проверяем, был ли передан параметр (имя архивного файла)
if ($args.Length -eq 0) {
Write-Error "Error: No archive file provided"
exit 1
}
# Считываем имя архивного файла из параметра
$archiveFile = $args[0]
# Разархивируем и импортируем
Unzip -SourcePath "$archiveFile" | mysql -u username -p'пароль' database_name
Выполните скрипт, передав имя архивного файла в качестве параметра: . import_db.ps1 database.sql.zip
Re: Репликация дампа базы данных sql
Добавлено: 28 мар 2025, 21:50
ya
Код: Выделить всё
#!/bin/bash
# Определяем переменные
ARCHIVE_FILE="path/to/your/archive.zip"
REMOTE_SERVER="your_remote_server"
REMOTE_USER="user"
MYSQL_USER="user_db"
MYSQL_PASSWORD="ваш_пароль"
DB_NAME="db_name"
# Выполнение команды через SSH
ssh "${REMOTE_USER}@${REMOTE_SERVER}" "unzip -p '${ARCHIVE_FILE}' | mysql -u '${MYSQL_USER}' -p'${MYSQL_PASSWORD}' '${DB_NAME}'"
Re: Репликация дампа базы данных sql
Добавлено: 26 май 2025, 17:08
ya
Для автоматической генерации ALTER TABLE потребуется сравнить текущую структуру и структуру из дампа
Код: Выделить всё
#!/bin/bash
# Переменные
DUMP_FILE="dump.sql"
UPDATED_DUMP="dump_updated.sql"
MYSQL_USER="ваш_пользователь"
MYSQL_PASSWORD="ваш_пароль"
DB_NAME="ваша_база"
# Создаем временный файл для обновленного дампа
cp "$DUMP_FILE" "$UPDATED_DUMP"
# Получаем список таблиц из дампа
tables=$(grep -oP '(?<=CREATE TABLE IF NOT EXISTS `).+?(?=`)' "$DUMP_FILE")
# Обработка каждой таблицы
for table in $tables; do
# Получить текущую структуру из базы
current_create=$(mysql -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "SHOW CREATE TABLE \`$table\`" "$DB_NAME" | awk '/CREATE TABLE/{print $0}')
# Получить структуру из дампа
# Выбираем блок CREATE TABLE IF NOT EXISTS для таблицы
awk -v table="$table" '
BEGIN {inside=0}
/CREATE TABLE IF NOT EXISTS `'"$table"'`/ {inside=1; print; next}
inside && /^;/ {print; inside=0; next}
{if (inside) print}
' "$DUMP_FILE" > table_struct_in_dump.sql
# Сравнить текущую структуру и структуру из дампа
echo "$current_create" > current_struct.sql
cat table_struct_in_dump.sql > dump_struct.sql
if ! diff -q current_struct.sql dump_struct.sql > /dev/null; then
# Структуры отличаются — генерируем ALTER TABLE
# Здесь можно использовать сторонний инструмент или вручную писать изменения
# Для простоты — выводим сообщение
echo "-- Структура таблицы $table отличается, добавляем ALTER TABLE" >> "$UPDATED_DUMP"
# Пример генерации простого ALTER (пример, не универсальный)
# Здесь нужно писать или автоматически генерировать правильные ALTER
# В реальной ситуации используют инструменты сравнения схем
echo "ALTER TABLE \`$table\` ..." >> "$UPDATED_DUMP"
fi
done
# В результате у вас будет обновленный дамп с командами ALTER TABLE после определения таблиц
# Очистка
rm current_struct.sql dump_struct.sql table_struct_in_dump.sql
echo "Обновленный дамп подготовлен: $UPDATED_DUMP"
данный функционал не является релизом для продакшэна
Проще пересоздать таблицы базы данных, чем в каждой отслеживать изменения структуры таблиц
как вариант вместо
вставить
тогда получится:
Код: Выделить всё
mysqldump --user=youruser --password=yourpassword --host=yourhost --database=yourdatabase > yourdatabase.sql
sed -i 's/CREATE TABLE/DROP TABLE IF EXISTS;\nCREATE TABLE/g' yourdatabase.sql