Configurar un destino de copia de seguridad para disco local
En los ejemplos siguientes verá el destino de copia de seguridad especificado como Disk('backups', '1.zip').
Para usar el motor de copia de seguridad Disk, primero debe añadir un archivo que especifique
el destino de copia de seguridad en la ruta que se indica a continuación:
/etc/clickhouse-server/config.d/backup_disk.xml
Por ejemplo, la siguiente configuración define un disco llamado backups y luego añade ese disco a
la lista allowed_disk de backups:
Configurar un destino de copia de seguridad para un disco S3
También es posible realizar BACKUP/RESTORE en S3 configurando un disco S3 en la
configuración de almacenamiento de ClickHouse. Configure el disco de esta forma, añadiendo un archivo a
/etc/clickhouse-server/config.d, como se hizo antes para el disco local.
BACKUP/RESTORE en disco S3 se realiza de la misma manera que en disco local:
BACKUP TABLE data TO Disk('s3_plain', 'cloud_backup');RESTORE TABLE data AS data_restored FROM Disk('s3_plain', 'cloud_backup');
Este disco no debe usarse para MergeTree en sí, solo para BACKUP/RESTORE
Si tus tablas usan almacenamiento S3 y los tipos de los discos son diferentes,
no se utilizan llamadas CopyObject para copiar las partes al bucket de destino; en su lugar,
se descargan y se vuelven a subir, lo cual es muy ineficiente. En este caso, es preferible usar
la sintaxis BACKUP ... TO S3(<endpoint>) para este caso de uso.
Hacer una copia de seguridad de una tabla y restaurarla
Ejecute los siguientes comandos para crear la base de datos y la tabla de prueba de las que
haremos una copia de seguridad y una restauración en este ejemplo:
Comandos de configuración
Cree la base de datos y la tabla:
CREATE DATABASE test_db;CREATE TABLE test_db.test_table ( id UUID, name String, email String, age UInt8, salary UInt32, created_at DateTime, is_active UInt8, department String, score Float32, country String) ENGINE = MergeTree()ORDER BY id;
Prepare e inserte mil filas de datos aleatorios:
INSERT INTO test_table (id, name, email, age, salary, created_at, is_active, department, score, country)SELECT generateUUIDv4() as id, concat('User_', toString(rand() % 10000)) as name, concat('user', toString(rand() % 10000), '@example.com') as email, 18 + (rand() % 65) as age, 30000 + (rand() % 100000) as salary, now() - toIntervalSecond(rand() % 31536000) as created_at, rand() % 2 as is_active, arrayElement(['Engineering', 'Marketing', 'Sales', 'HR', 'Finance', 'Operations'], (rand() % 6) + 1) as department, rand() / 4294967295.0 * 100 as score, arrayElement(['USA', 'UK', 'Germany', 'France', 'Canada', 'Australia', 'Japan', 'Brazil'], (rand() % 8) + 1) as countryFROM numbers(1000);
A continuación, deberá crear un archivo que especifique el destino de la copia de seguridad en la
siguiente ruta:
El RESTORE anterior fallará si la tabla test.table contiene datos.
La configuración allow_non_empty_tables=true permite que RESTORE TABLE inserte datos
en tablas no vacías. Esto mezclará los datos que ya había en la tabla con los datos extraídos de la copia de seguridad.
Por lo tanto, esta configuración puede provocar la duplicación de datos en la tabla y debe usarse con precaución.
Para restaurar la tabla cuando ya contiene datos, ejecute:
RESTORE TABLE test_db.test_table FROM Disk('backups', '1.zip')SETTINGS allow_non_empty_tables=true
Las tablas se pueden restaurar o respaldar con nombres nuevos:
RESTORE TABLE test_db.test_table AS test_db.test_table_renamed FROM Disk('backups', '1.zip')
El archivo de la copia de seguridad tiene la siguiente estructura:
Una copia de seguridad base en ClickHouse es la copia de seguridad completa inicial a partir de la cual se crean las
siguientes copias de seguridad incrementales. Las copias de seguridad incrementales solo almacenan los cambios
realizados desde la copia de seguridad base, por lo que esta debe mantenerse disponible para
poder restaurar desde cualquier copia de seguridad incremental. El destino de la copia de seguridad base puede establecerse con la opción
base_backup.
Las copias de seguridad incrementales dependen de la copia de seguridad base. La copia de seguridad base debe mantenerse disponible
para poder restaurar desde una copia de seguridad incremental.
Para hacer una copia de seguridad incremental de una tabla, primero haga una copia de seguridad base:
BACKUP TABLE test_db.test_table TO Disk('backups', 'd.zip')
BACKUP TABLE test_db.test_table TO Disk('backups', 'incremental-a.zip')SETTINGS base_backup = Disk('backups', 'd.zip')
Todos los datos de la copia de seguridad incremental y de la copia de seguridad base se pueden restaurar en una
tabla nueva test_db.test_table2 con el comando:
RESTORE TABLE test_db.test_table AS test_db.test_table2FROM Disk('backups', 'incremental-a.zip');
A las copias de seguridad escritas en disco se les puede aplicar una contraseña al archivo.
La contraseña puede especificarse mediante la configuración password.
La protección con contraseña solo es compatible con archivos ZIP (.zip, .zipx).
La ruta de la copia de seguridad debe terminar en .zip o .zipx para que se acepte la contraseña.
Usar una contraseña con cualquier otro formato, incluidos los archivos tar y las rutas que no apuntan a archivos,
dará como resultado el error BAD_ARGUMENTS: Password is not applicable, backup cannot be encrypted.
Las copias de seguridad pueden almacenarse no solo como archivos zip, sino también como archivos tar.
La funcionalidad es la misma que con zip, salvo que la protección con contraseña no está
disponible para los archivos tar. Además, los archivos tar admiten varios
métodos de compresión.Para hacer una copia de seguridad de una tabla como archivo tar:
BACKUP TABLE test_db.test_table TO Disk('backups', '1.tar')
para restaurar a partir de un archivo tar:
RESTORE TABLE test_db.test_table FROM Disk('backups', '1.tar')
Para cambiar el método de compresión, se debe añadir el sufijo de archivo correcto al
nombre de la copia de seguridad. Por ejemplo, para comprimir el archivo TAR con gzip, ejecute:
BACKUP TABLE test_db.test_table TO Disk('backups', '1.tar.gz')
Los sufijos de archivo de compresión admitidos son:
Si es necesario restaurar particiones específicas asociadas a una tabla, se pueden indicar aquí.Vamos a crear una tabla sencilla particionada en cuatro particiones, insertar algunos datos y luego
hacer una copia de seguridad solo de la primera y la cuarta partición:
Configuración
CREATE IF NOT EXISTS test_db;-- Crear una tabla particionadaCREATE TABLE test_db.partitioned ( id UInt32, data String, partition_key UInt8) ENGINE = MergeTree()PARTITION BY partition_keyORDER BY id;INSERT INTO test_db.partitioned VALUES(1, 'data1', 1),(2, 'data2', 2),(3, 'data3', 3),(4, 'data4', 4);SELECT count() FROM test_db.partitioned;SELECT partition_key, count() FROM test_db.partitionedGROUP BY partition_keyORDER BY partition_key;