Home » Полезные советы » Бэкап всех баз mysql в отдельные файлы

Бэкап всех баз mysql в отдельные файлы

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

Самый простой способ сделать бэкап всех базы с помощью mysqldump следующий:

# /usr/bin/mysqldump -uroot -hlocalhost -p'password' --all-databases | /usr/bin/gzip -c > /backup/mysql/`date "+%Y-%m-%d"`.gz

На выходе будет один сжатый файл с именем вида 2018-09-27.gz, в котором будет дамп всех mysql баз сервера, в том числе служебных таблиц. Работать с таким файлом потом очень неудобно. Это подходит только для случая, когда вы на таком же сервере будете восстанавливать все базы данных.

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

# mysql -u root -p --one-database destdbname < alldatabases.sql

У меня она не заработала. Консольная mysql выдавала ошибку. Я не стал подробно разбираться. Затем попробовал с помощью sed выдернуть информацию только о нужной базе, но сходу не получилось, так как дамп был большой. Просто просмотреть его была проблема, а тренироваться на тестовых дампах — тратить лишнее время. Проще было пойти на исходный сервер и вытащить только нужную базу данных.

Заодно заменил скрипт бэкапа на следующий:

for i in `mysql -uroot -p'password' -e'show databases;' | grep -v information_schema | grep -v Database`; 
    do 
	/usr/bin/mysqldump -uroot -p'password' $i | /usr/bin/gzip -c > /backup/mysql/`date +%Y-%m-%d`-$i.sql.gz;
    done

Сначала кладем в массив список всех баз данных, а потом делаем отдельный дамп каждой из них и сжимаем.

Был бы рад, если бы кто-то подсказал простой и рабочий способ загрузить на сторонний сервер одну базу данных из общего дампа. Очень часто приходится видеть такие бэкапы от всяких панелей управления или самодельных скриптов.

Помогла статья? Есть возможность отблагодарить автора

5 комментариев

  1. Аноним

    Примерно также делал. Была нужда.

    #!/bin/bash
    
    suffix=$(date +%F)
    dbs=$(sudo mysql --defaults-extra-file=/root/.my.cnf --batch --skip-column-names -e "SHOW DATABASES;" | grep -E -v "(information|performance)_schema")
    tmp=$(mktemp -d)
    outDir="/var/backup/mysql"
    out="$outDir/$suffix.tar.bz2"
    
    if [ ! -d "$outDir" ];then
      mkdir -p "$outDir"
    fi
    
    for db in $dbs; do
      mysqldump --defaults-extra-file=/root/.my.cnf --databases "$db" > "$tmp/$db.sql"
    done
    
    cd $tmp
    tar -jcf "$out" * > "/dev/null"
    cd "/tmp/"
    sudo rm -rf "$tmp"
    • Вариантов тут много. У меня самого скриптов 10 разных наберется по бэкапу mysql. Иногда приходится работать с полными бэкапами, которые делал не сам и других нет. Интересно, как другие выкручиваются в подобных ситуациях.

      • Аноним

        На днях занимался корректным резервированием базы на виртуалке в Azure при создании резервной копии всего сервера. Нагуглил вот такое решение — https://github.com/MicrosoftAzureBackup/MySQL . Там вообще потабличный дамп делается.
        Ну а по поводу выцепить дамп отдельной базы из общего — самый простой вариант видится — экспортнуть дамп на mysql и сделать дамп уже как надо. Ну и переделать алгоритм резервирования, чтобы впредь одним файлом дамп не снимался.
        Да, решение примитивное и что называется «в лоб», но что называется тут и сейчас 🙂

        • Кстати, это тоже первое, что мне пришло в голову сразу. Это реально может оказаться самым быстрым способом.

    • Как в примере выше тоже задался вопросом как делать бэкап всех баз, кроме некоторых, при этом необязательно системных, в итоге список баз выбирается так:
      #!/bin/bash

      ...
      DBS="$(mysql -u $db_user -h $db_host -p$db_pass -Bse 'SELECT `SCHEMA_NAME` from `INFORMATION_SCHEMA`.`SCHEMATA` WHERE `SCHEMA_NAME` NOT in ("test", "mysql", "information_schema");')"
      for db in $DBS; do
      ...

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

Ваш e-mail не будет опубликован.

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