Резервное копирование баз данных ClickHouse

Содержание

Введение

В составе ClickHouse нет инструментов для резервного копирования, как это принято в случае MySQL или PostgreSQL. Вместо этого в сервере ClickHouse, начиная с версии 21.10, есть встроенные средства резервного копирования.

Настройка сервера

Для того, чтобы воспользоваться встроенными средствами резервного копирования, нужно добавить в файл конфигурации /etc/clickhouse-server/config.xml описание хранилища резервных копий:

<yandex>
    <storage_configuration>
        <disks>
            <backups>
                <type>local</type>
                <path>/backups/</path>
            </backups>
        </disks>
    </storage_configuration>
    <backups>
        <allowed_disk>backups</allowed_disk>
        <allow_concurrent_backups>false</allow_concurrent_backups>
        <allow_concurrent_restores>false</allow_concurrent_restores>
    </backups>
</yandex>

В ветке <storage_configuration> описана конфигурация локального хранилища, которое располагается в каталоге /backups/ и называется backups.

В ветке <backups> даётся разрешение использовать хранилище с именем backups в качестве аргумента для встроенной функции Disk (см. далее). Две другие опции запрещают выполнять одновременно несколько операций резервного копирования или восстановления данных из резервных копий.

Убедитесь, что каталог для резервных копий существует, а сервер ClickHouse имеет к нему доступ. Если каталога для резервных копий ещё нет, то создать его и выставить необходимые права доступа можно, например, следующим образом:

# mkdir /backups/
# chown clickhouse:clickhouse /backups/
# chmod u=rwx,g=rx,o= /backups/

Чтобы применить изменения, внесённые в файл конфигурации, нужно перезапустить сервер ClickHouse:

# systemctl restart clickhouse-server

Резервное копирование и восстановление

Теперь можно подключиться к серверу ClickHouse клиентом и выполнять запросы для резервного копирования и восстановления таблиц и баз данных. Например, чтобы создать архив userloginjournal.zip, содержащий резервную копию таблицы userloginjournal из базы данных smart_house_box, можно поступить одним из двух способов. Можно сначала поменять текущую базу данных, а затем сохранить таблицу, указав её имя внутри базы данных:

USE smart_house_box;
BACKUP TABLE userloginjournal TO Disk('backups', 'userloginjournal.zip');

Обратите внимание, что имя функции Disk начинается с заглавной буквы - имена функций в ClickHouse чувствительны к регистру.

После выполнения запроса в каталоге /backups/ появится архив с именем userloginjournal.zip.

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

BACKUP TABLE smart_house_box.userloginjournal TO Disk('backups', 'userloginjournal.zip');

Для восстановления таблиц используются выражения, которые кажутся совершенно очевидными после того, как мы познакомились с выражениями для резервного копирования:

RESTORE TABLE smart_house_box.userloginjournal FROM Disk('backups', 'userloginjournal.zip');

Если имя базы данных не указано, то таблица будет восстановлена в текущую базу данных.

А что делать, если нужно восстановить данные из таблицы в таблицу с другим именем? Для этого достаточно указать после исходного имени таблицы её новое имя, вот так:

RESTORE TABLE smart_house_box.userloginjournal AS smart_house_box.userloginjournal2 FROM Disk('backups', 'userloginjournal.zip');

Кроме отдельных таблиц можно выполнять резервное копирование отдельных баз данных. Делается это аналогичными запросами, в которых ключевое слово TABLE нужно заменить на ключевое слово DATABASE:

BACKUP DATABASE smart_house_box TO Disk('backups', 'smart_house_box.zip');
RESTORE DATABASE smart_house_box AS smart_house_box_restored TO Disk('backups', 'smart_house_box.zip');

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

Периодическое резервное копирование

Для автоматизации резервного копирования всех баз данных, кроме базы данных default, а также баз данных information_schema и INFORMATION_SCHEMA, я написал скрипт chbackup.sh. Скрипт формирует в каталоге для резервных копий файлы с именами вида dbname.YYYYmmdd.zip, где dbname - имя базы данных, YYYYmmdd - текущая дата.

Путь к каталогу с резервными копиями можно поменять в переменной окружения BACKUPS. Учтите, что в скрипте предполагается, что путь должен оканчиваться косой чертой. Если создание резервной копии очередной базы данных завершилось удачно, скрипт удаляет резервные копии этой базы данных, устаревшие более чем на 3 суток. Время хранения резервных копий можно поменять с помощью переменной DAYS.

Использованные материалы