Страница 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"
данный функционал не является релизом для продакшэна

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

Код: Выделить всё

CREATE TABLE IF NOT EXISTS
вставить

Код: Выделить всё

DROP TABLE IF EXISTS; CREATE TABLE 
тогда получится:

Код: Выделить всё

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