As interrupções de produção são quase garantidas em algum momento. Sabemos disso, por isso planejamos backups, criamos bancos de dados de espera de recuperação, convertemos instâncias únicas em clusters.
Admitindo a necessidade de um cenário de recuperação adequado, devemos analisar o possível cronograma de desastres e cenários de falha e implementar etapas para ativar seu banco de dados. A execução de interrupção planejada pode ajudar a preparar, diagnosticar e recuperar-se da próxima. Para mitigar o impacto do tempo de inatividade, as organizações precisam de um plano de recuperação adequado, que inclua todos os fatores necessários para dar vida ao serviço.
O gerenciamento de backup não é tão suave quanto apenas agendar um trabalho de backup. Há muitos fatores a serem considerados, como retenção, armazenamento, verificação e se os backups que você está fazendo são físicos ou lógicos e o que é fácil ignorar a segurança.
Muitas organizações variam sua abordagem de backups, tentando ter uma combinação de backups de imagem de servidor (snapshots), backups lógicos e físicos armazenados em vários locais. É para evitar quaisquer desastres locais ou regionais que apaguem nossos bancos de dados e backups armazenados no mesmo data center.
Queremos torná-lo seguro. Dados e backups devem ser criptografados. Mas há muitas implicações quando ambas as opções estão em vigor. Neste artigo, veremos os procedimentos de backup quando lidamos com bancos de dados criptografados.
Criptografia em repouso para servidor Percona para MySQL 8.0
A partir do MySQL 5.7.11, a versão da comunidade do MySQL começou a oferecer suporte para criptografia de tablespace InnoDB. É chamado de Criptografia de Tablespace Transparente ou conhecido como Criptografia em Repouso.
A principal diferença em relação à versão corporativa é a forma como as chaves são armazenadas - as chaves não estão localizadas em um cofre seguro, o que é necessário para conformidade regulatória. O mesmo se aplica ao Percona Server, a partir da versão 5.7.11, é possível criptografar o tablespace InnoDB. No Percona Server 8.0, o suporte para criptografia de logs binários foi bastante estendido. Versão 8.0 adicionada
(De acordo com o documento de versão do Percona 8.0):
- Criptografia de arquivo temporário
- InnoDB Undo Tablespace Encryption
- Criptografia de espaço de tabela do sistema InnoDB (criptografia de espaço de tabela do sistema InnoDB)
- default_table_encryption =OFF/ON (criptografia geral de tablespace)
- table_encryption_privilege_check =OFF/ON (verificação das configurações de criptografia)
- Criptografia de redo log do InnoDB (somente para criptografia de chave mestra) (Criptografia de redo log)
- Criptografia de arquivo de mesclagem InnoDB (verificando a configuração de criptografia)
- Criptografia de buffer de gravação dupla paralela Percona (Criptografia de espaço de tabela InnoDB)
Para os interessados na migração da versão MySQL Enterprise para Percona - Também é possível integrar com o servidor Hashicorp Vault por meio de um plugin keyring_vault, combinando com os recursos disponíveis na edição MySQL Enterprise da Oracle.
A criptografia de dados em repouso requer um plug-in de chaveiro. Há duas opções aqui:
- keyring_file - um arquivo simples com uma chave de criptografia
- Plugin do Keyring Vault - um serviço
Como habilitar a criptografia de tablespace
Para habilitar a criptografia, inicie seu banco de dados com a opção --early-plugin-load:
quer à mão:
$ mysqld --early-plugin-load="keyring_file=keyring_file.so"
ou modificando o arquivo de configuração:
[mysqld]
early-plugin-load=keyring_file.so
Ao iniciar o Percona Server 8.0, dois tipos de tablespaces podem ser criptografados. Espaço de tabela geral e espaço de tabela do sistema. O tablespace Sys é controlado por meio do parâmetro innodb_sys_tablespace_encrypt. Por padrão, o tablespace sys não é criptografado e, se você já tiver um, não é possível convertê-lo para o estado criptografado, uma nova instância deve ser criada (inicie uma instância com a opção --bootstrap).
O tablespace geral suporta criptografia de todas as tabelas no tablespace ou nenhuma. Não é possível executar a criptografia no modo misto. Para criar um tablespace com criptografia, use o sinalizador ENCRYPTION='Y/N'.
Exemplo:
mysql> CREATE TABLESPACE severalnines ADD DATAFILE 'severalnines.ibd' ENCRYPTION='Y';
Fazendo backup de um banco de dados criptografado
Ao adicionar tablespaces criptografados é necessário incluir o arquivo keyring no comando xtrabackup. Para fazer isso, você deve especificar o caminho para um arquivo de chaveiro como o valor da opção --keyring-file-data.
$ xtrabackup --backup --target-dir=/u01/mysql/data/backup/ --user=root --keyring-file-data=/u01/secure_location/keyring_file
Certifique-se de armazenar o arquivo do chaveiro em um local seguro. Além disso, certifique-se de sempre ter um backup do arquivo. O Xtrabackup não copiará o arquivo de chaveiro no diretório de backup. Para preparar o backup, você mesmo precisa fazer uma cópia do arquivo do chaveiro.
Preparando o backup
Uma vez que tenhamos nosso arquivo de backup, devemos prepará-lo para a recuperação. Aqui você também precisa especificar o arquivo keyring-data.
$ xtrabackup --prepare --target-dir=/u01/mysql/data/backup/ --keyring-file-data=/u01/secure_location/keyring_file
O backup agora está preparado e pode ser restaurado com a opção --copy-back. Caso o chaveiro tenha sido girado, você precisará restaurar o chaveiro (que foi usado para fazer e preparar o backup).
Para preparar o backup xtrabackup, precisaremos acessar o chaveiro. O Xtrabackup não fala diretamente com o servidor MySQL e não lê o arquivo de configuração padrão my.cnf durante a preparação, especifique as configurações do keyring através da linha de comando:
$ xtrabackup --prepare --target-dir=/data/backup --keyring-vault-config=/etc/vault.cnf
O backup agora está preparado e pode ser restaurado com a opção --copy-back:
$ xtrabackup --copy-back --target-dir=/u01/backup/ --datadir=/u01/mysql/data/
Executando backups incrementais
O processo de fazer backups incrementais com a criptografia de tablespace InnoDB é semelhante a fazer os mesmos backups incrementais com um tablespace não criptografado.
Para fazer um backup incremental, comece com um backup completo. O binário xtrabackup grava um arquivo chamado xtrabackup_checkpoints no diretório de destino do backup. Este arquivo contém uma linha mostrando o to_lsn, que é o LSN do banco de dados ao final do backup.
Primeiro, você precisa criar um backup completo com o seguinte comando:
$ xtrabackup --backup --target-dir=/data/backups/base --keyring-file-data=/var/lib/mysql-keyring/keyring
Agora que você tem um backup completo, pode fazer um backup incremental com base nele. Use um comando como o seguinte:
$ xtrabackup --backup --target-dir=/data/backups/inc1 \
--incremental-basedir=/data/backups/base \
--keyring-file-data=/var/lib/mysql-keyring/keyring
O diretório /data/backups/inc1/ agora deve conter arquivos delta, como ibdata1.delta e test/table1.ibd.delta.
O significado deve ser evidente. Agora é possível usar este diretório como base para mais um backup incremental:
$ xtrabackup --backup --target-dir=/data/backups/inc2 \
--incremental-basedir=/data/backups/inc1 \
--keyring-file-data=/var/lib/mysql-keyring/keyring
Preparando backups incrementais
Até agora, o processo de backup do banco de dados é semelhante a um backup regular, exceto pelo sinalizador em que especificamos a localização do arquivo do chaveiro.
Infelizmente, a etapa --prepare para backups incrementais não é a mesma para backups normais.
Nos backups normais, dois tipos de operações são executados para tornar o banco de dados consistente:as transações confirmadas são reproduzidas do arquivo de log em relação aos arquivos de dados e as transações não confirmadas são revertidas. Você deve ignorar a reversão de transações não confirmadas ao preparar um backup, porque as transações que não foram confirmadas no momento do backup podem estar em andamento e é provável que sejam confirmadas no próximo backup incremental. Você deve usar a opção --apply-log-only para evitar a fase de reversão.
Se você não usar a opção --apply-log-only para evitar a fase de reversão, seus backups incrementais serão inúteis. Depois que as transações forem revertidas, backups incrementais adicionais não poderão ser aplicados.
Começando com o backup completo que você criou, você pode prepará-lo e depois aplicar as diferenças incrementais a ele. Lembre-se de que você tem os seguintes backups:
/data/backups/base
/data/backups/inc1
/data/backups/inc2
Para preparar o backup básico, você precisa executar --prepare como de costume, mas evitar a fase de rollback:
$ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base --keyring-file-data=/var/lib/mysql-keyring/keyring
Para aplicar o primeiro backup incremental ao backup completo, você deve usar o seguinte comando:
$ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \
--incremental-dir=/data/backups/inc1 \
--keyring-file-data=/var/lib/mysql-keyring/keyring
se o chaveiro foi alternado entre o backup básico e o incremental, você precisará usar o chaveiro que estava em uso quando o primeiro backup incremental foi feito.
Preparar o segundo backup incremental é um processo semelhante
$ xtrabackup --prepare --target-dir=/data/backups/base \
--incremental-dir=/data/backups/inc2 \
--keyring-file-data=/var/lib/mysql-keyring/keyring
Observação; --apply-log-only deve ser usado ao mesclar todos os incrementais, exceto o último. É por isso que a linha anterior não contém a opção --apply-log-only. Mesmo que o --apply-log-only fosse usado na última etapa, o backup ainda seria consistente, mas nesse caso o servidor executaria a fase de reversão.
A última etapa é restaurá-lo com --copy-back opção. Caso o chaveiro tenha sido girado, você precisará restaurar o chaveiro que foi usado para fazer e preparar o backup.
Embora o método de restauração descrito funcione, ele requer acesso ao mesmo chaveiro que o servidor está usando. Pode não ser possível se o backup for preparado em um servidor diferente ou em um momento muito posterior, quando as chaves do chaveiro forem removidas ou, em caso de mau funcionamento, quando o servidor do cofre do chaveiro não estiver disponível.
A opção --transition-key= O exemplo a seguir ilustra como o backup pode ser criado neste caso: Ao restaurar um backup, você precisará gerar uma nova chave mestra. Aqui está o exemplo para keyring_file: No caso de keyring_vault, ficará assim:
Criando um backup com uma senha
$ xtrabackup --backup --user=root -p --target-dir=/data/backup \
--transition-key=MySecetKey
Restaurando o backup com uma chave gerada
$ xtrabackup --copy-back --target-dir=/data/backup --datadir=/data/mysql \
--transition-key=MySecetKey --generate-new-master-key \
--keyring-file-data=/var/lib/mysql-keyring/keyring
$ xtrabackup --copy-back --target-dir=/data/backup --datadir=/data/mysql \
--transition-key=MySecetKey --generate-new-master-key \
--keyring-vault-config=/etc/vault.cnf