Для автоматической генерации 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