A atual evolução tecnológica de todos os aspectos da vida tornou os dados mais preciosos do que ouro e prata. Se você pode adquirir, crescer e proteger dados, está a um passo de ser um deus dos dados. No entanto, grandes empresas que controlam aspectos da vida como comércio eletrônico, combustível, transporte e paisagens alimentares dependem da proteção de dados para se proteger de um colapso inevitável.
Neste momento, perder dados é como perder seu seguro de vida. Portanto, o sistema de gerenciamento de banco de dados que você está usando deve ter uma orientação de backup. Se você é um administrador MySQL ou um usuário que lida com dados crescentes, você deve considerar a implementação de um plano de automação de backup mais frequente. Razão? Você pode acabar sendo vítima de um hack de dados ou até mesmo alterar seus dados por acidente.
Tais circunstâncias podem levar a violações de dados implacáveis, especialmente quando você não tem um plano de backup de banco de dados. Se você é um usuário ou administrador do MySQL, este artigo está aqui para corrigir suas preocupações com o backup do banco de dados. Vamos cumprir dois objetivos. Primeiro, você entenderá a implementação da exportação de bancos de dados através do “mysqldump”. Então, por fim, abordaremos como o uso do “crontab” pode facilitar todo esse processo através da automação.
Prepare um diretório de backup de dados
Como o Linux não faz uma recomendação do usuário para um destino de backup de dados MySQL, cabe a você escolher um local de backup adequado. Por exemplo, neste guia tutorial, trabalharemos em um diretório de backup em “/var/www_my_backups/”. Estamos considerando essa abordagem apenas para entender os mecanismos de backup de dados do MySQL. Idealmente, é recomendável que os backups de dados importantes ocorram em um servidor offside.
Você pode criar seu diretório de backup preferido em sua máquina local por meio de um comando de terminal semelhante ao seguinte:
$ sudo mkdir /var/www_my_backups/
Certifique-se de que a máquina de backup operada pelo Linux que você está usando tenha privilegiado você com acesso root ou privilégios sudo. Se você não tiver acesso de proprietário ao diretório de backup criado, você enfrentará erros de permissão ao executar testes do mysqldump. O comando a seguir deve listar o usuário do sistema atualmente ativo e detalhar se você possui privilégios de propriedade na pasta de backup criada.
$ sudo chown $(whoami):$(whoami) /var/www_my_backups/
O utilitário cliente mysqldump
Esta ferramenta MySQL realiza backups lógicos. Isso resulta em vários conjuntos de instruções SQL, que recriam os dados originais da tabela de banco de dados e as definições de objetos quando executados. Além disso, um ou vários dumps de banco de dados MySQL são copiados ou transferidos para um servidor de banco de dados SQL secundário.
Um comando mysqldump padrão é representado pela seguinte sintaxe de comando.
$ mysqldump -u [mysql_username] -p[mysql_password] [mysql_database_name] > /path/to/[mysql_dump_file_name].sql
- -u [mysql_username]: representa um usuário privilegiado do banco de dados MySQL. Este usuário deve ser capaz de executar operações de dump de banco de dados.
- -p[mysql_password]: representa a senha do usuário do banco de dados MySQL. Não adicione um espaço entre “-p” e “[mysql_password]”.
- [mysql_dump_file_name]: representa o nome do seu banco de dados MySQL.
- >: aponta para o destino do dump de saída
- /path/to/[mysql_dump_file_name].sql: aponta para o local do caminho do arquivo de despejo associado. Você pode dar a este arquivo de despejo [mysql_dump_file_name] um nome personalizado, se quiser.
Antes de prosseguirmos com este guia tutorial, há algo que vale a pena mencionar sobre “-p[mysql_password]”. Embora este guia de artigos se concentre em associar seu uso a vários exemplos de dump do MySQL, você deve evitar usá-lo diretamente ao manipular seus dumps de backup MySQL reais, especialmente em uma rede compartilhada.
Um dump em execução pode ser invadido com um comando bidimensional como "ps ax", revelando o nome de usuário e a senha do banco de dados associado. No entanto, usar o local “~/.my.cnf” para armazenar sua senha do banco de dados MySQL torna desnecessário o uso de “-p[mysql_password]” no comando dump declarado. Se este comando dump estiver sendo executado por meio de um cron job, a opção de comando “–defaults-extra-file=/path/to/.my.cnf” deve apontar o comando mysqldump para o local da senha do banco de dados.
Alguns exemplos de backup de banco de dados MySQL
Vamos considerar vários cenários de usuário onde podemos usar o comando mysqldump para fazer backup dos dados do banco de dados MySQL.
Fazendo backup de todos os bancos de dados
Usar a opção de comando “–all-databases” em seu comando mysqldump cuidará de todos os dumps do banco de dados MySQL em seu sistema Linux. Por exemplo, o comando a seguir demonstra como fazer dump de todos os seus bancos de dados MySQL para o arquivo “/var/www_my_backups/” já existente. O usuário deste sistema Linux deve ser root ou ter privilégios sudo.
No nosso caso, e para sua compreensão, nomeamos nosso arquivo de despejo como “all-databases.sql”, mas você pode usar qualquer outro nome de sua preferência. Como estamos lidando com todos os bancos de dados, é necessário ser um usuário root da conta MySQL.
$ mysqldump -u root -p[mysql_password] --all-databases > /var/www_my_backups/all-databases.sql
Fazendo backup de um banco de dados
Se apenas um banco de dados MySQL for significativo para você, criar seu backup com o comando mysqldump requer a substituição da opção de comando “[mysql_database]” pelo nome real. O nome do arquivo de despejo pode levar o nome desse banco de dados “[mysql_database].sql” para que seja fácil rastreá-lo e restaurá-lo posteriormente. Você também pode usar outro nome de arquivo de despejo personalizado, se desejar.
Este comando de exemplo é implementado usando o usuário root, mas qualquer outro usuário com acesso ao banco de dados de destino é uma opção viável.
$ mysqldump -u root -p[mysql_password] [mysql_database_name] > /var/www_my_backups/[mysql_database_name].sql
Fazendo backup de vários bancos de dados
Talvez você tenha uma seleção específica de bancos de dados MySQL que deseja fazer backup. Neste caso, a opção de comando “[mysql_database_name]” aparecerá mais de uma vez, e cada caso é associado ao nome do banco de dados que você deseja fazer backup. Lembre-se de espaçar os nomes desses bancos de dados no comando mysqldump. O arquivo de despejo “[mysql_database_name].sql” também deve ser associado a um nome exclusivo que você lembrará.
$ mysqldump -u root -p[mysql_password] [mysql_database_1_name] [mysql_database_2_name] > /var/www_my_backups/[mysql_databases_1_2_names].sql
Fazendo backup de uma única tabela
Quando sua rotina de backup é somente após uma tabela de banco de dados específica, a criação de seu backup deve ter tanto o nome do banco de dados quanto o nome da tabela do banco de dados como opções de comando do comando mysqldump. Você pode dar ao seu arquivo de despejo o mesmo nome da tabela de banco de dados de destino, por exemplo [mysql_database_table_name].sql.
$ mysqldump -u root -p[mysql_password] [mysql_database_name] [mysql_database_table_name] > /var/www_my_backups/[mysql_databases_table_name].sql
Fazendo backup de várias tabelas
Quando você deseja fazer backup de muitas tabelas de banco de dados MySQL específicas, uma menção de todos os nomes de tabela de banco de dados selecionados deve vir após o nome do banco de dados que hospeda essas tabelas. O arquivo de despejo de destino pode ter um nome como [mysql_database_tables_1_2_names].sql
$ mysqldump -u root -p[mysql_password] [mysql_database_name] [mysql_database_table_1_name] [mysql_database_table_2_name] > /var/www_my_backups/[mysql_databases_tables_1_2_names].sql
Fazendo backup de um banco de dados remoto
Esta implementação de exemplo também é direta. O comando de despejo do banco de dados MySQL precisará incluir a opção de comando “-h” seguida pelo nome do host da máquina remota ou endereço IP associado. Todas as outras sintaxes de comando de backup de banco de dados usuais devem seguir.
$ mysqldump -h [remote_computer_ip_or_hostname] -u root -p[mysql_password] [mysql_database_name] > /var/www_my_backups/[remote_mysql_database_name].sql
Você pode ajustar este comando mysqldump para lidar com os outros casos de backup de banco de dados já discutidos, por exemplo, backups MySQL com vários bancos de dados ou tabelas.
Fazendo backup de um banco de dados associado a compactações
Se você deseja associar seus backups de dados com compactações, o “| gzip -c>” opção de comando mysqldump pode ser usada para canalizar uma saída gzip.
$ mysqldump -u root -p[mysql_password] [mysql_database_name] | gzip -c > /var/www_my_backups/[mysql_database_name].sql.gz
Se seu banco de dados MySQL for enorme e você quiser acompanhar o progresso da compactação, sempre considere implementar a opção detalhada conforme descrito no exemplo a seguir.
$ mysqldump -u root -p[mysql_password] [mysql_database_name] | gzip -c --verbose > /var/www_my_backups/[mysql_database_name].sql.gz
Restaurando o banco de dados MySQL
Depois de concluir o backup do banco de dados MySQL, o que vem a seguir? Como você acessa os dados que você protegeu com tanto cuidado? A restauração de seus dados requer a adesão à seguinte sintaxe de restauração do MySQL.
$ mysql -u [mysql_username] -p[mysql_password] [mysql_database_name] < /path/to/[mysql_database_name].sql
Como você pode não ter notado, a única diferença entre este comando de restauração de banco de dados e o comando de backup de banco de dados é que usamos a opção “mysql” em vez da opção “mysqldump” e a opção “<” em vez da opção “>”.
Automatizando backups do MySQL
O sistema operacional Linux está equipado com vários serviços úteis que são inestimáveis para um administrador de banco de dados como o do MySQL RDBMS. Um desses serviços é o serviço cron. É eficaz no agendamento de comandos automatizados. Esses comandos, uma vez criados, são alocados para a tabela cron do crontab. Você pode acessar o crontab através do seguinte comando.
$ sudo crontab -e
Se solicitado, este comando pode querer associar sua execução a um editor de texto para selecionar o editor de texto nano.
Um arquivo com um nome como “/tmp/crontab.LVY6A9/crontab” será aberto. Na parte inferior deste arquivo crontab, insira um cronograma cron viável junto com um comando de despejo do MySQL aplicável. O exemplo ilustrado abaixo implementa o uso da compactação gzip para backups diários de banco de dados. Às vezes, você pode ter arquivos .sql grandes agendados para backup. O uso do gzip reduz esses arquivos a tamanhos razoáveis antes do armazenamento de backup. Ele ajuda no gerenciamento de memória de backup.
00 03 * * * mysqldump -u root -p[mysql_password] [mysql_database_name] | gzip -c > /var/www_my_backups/[mysql_database_name].sql.gz
A opção de comando “00 03 ***” pode ser interpretada da seguinte maneira. A cada 24 horas após as 3 da manhã, o comando mysqldump seguinte é executado para fazer backup de um banco de dados. O arquivo de backup do banco de dados que existia atualmente antes do início desse processo de backup é substituído. No seu caso, você não precisa esperar 24 horas para testemunhar sua automação de backup de banco de dados em ação por meio do crontab.
Você pode editar a opção “00 03 ***” no arquivo crontab para algo como “02 00 ***” e em apenas dois minutos, o processo de backup deve ser auto-inicializado. Alternativamente, se seu horário for 22:30, editar o arquivo com “34 22 ***” irá inicializar o processo de backup do banco de dados às 22:34. Lembre-se de salvar (Ctrl+X) este arquivo crontab antes de fechá-lo para que este comando se torne executável.
Após os minutos definidos, o cron job deve ter sido executado. Em seguida, liste a pasta de backup criada em seu terminal e o arquivo de backup .sql.gz criado deve estar presente.
$ ls -l /var/www_my_backups/
A saída resultante deve ser semelhante à seguinte:
-rw-r--r-- 1 root root 36M Jul 29 22:24 [mysql_database_name].sql.gz
Se você tiver problemas para localizar o arquivo de backup MySQL .sql.gz, revise seu tempo crontab ou todo o comando. Pode haver um erro de sintaxe ou algo pode estar faltando. Como alternativa, o log cron do sistema pode apontar para onde há um problema.
$ sudo grep CRON /var/log/syslog
Lembre-se de redefinir a entrada do crontab para sua programação de banco de dados preferida assim que confirmar que tudo está funcionando corretamente.
Usando my.cnf para armazenar senhas do banco de dados MySQL
Já mencionamos as desvantagens da opção “-p[mysql_password]” em um comando mysqldump, especialmente em uma rede compartilhada. Precisamos discutir como implementar o armazenamento de senhas no arquivo “~/.my.cnf”. Os usuários que usam cron para automatizar seus backups de banco de dados precisarão entender a implementação da opção de comando “–defaults-extra-file=/path/to/.my.cnf”.
Editando o arquivo my.cnf
O diretório inicial do seu sistema Linux contém esse arquivo oculto. O caminho direto do sistema para ele é “/home/your_username/.my.cnf”. Use o editor de texto nano para abrir este arquivo. A opção “~” aponta para o diretório inicial.
$ sudo nano ~/.my.cnf
Edite este arquivo aberto de acordo com a seguinte sintaxe para armazenar com sucesso a senha do banco de dados MySQL. A parte “YOUR_DB_PASS” é a única entrada que você precisa alterar com sua senha real do banco de dados. Insira esses detalhes de informações na parte inferior do arquivo e salve-os.
[mysqldump]
password=YOUR_DB_PASS
Use Ctrl+X para salvar este arquivo. Este arquivo “my.cnf” também precisa de algumas configurações de permissão. Implemente o seguinte comando:
$ sudo chmod 600 ~/.my.cnf
Agora é hora de ver a recriação do nosso novo comando mysqldump com a opção de comando “-p[mysql_password]” eliminada.
$ mysqldump -u root [mysql_database_name] | gzip -c > /var/www_my_backups/[mysql_database_name].sql.gz
Como você pode ver, não adicionamos nada. Parece que a única coisa que removemos é a opção de comando “-p[mysql_password]”.
Crontab e –defaults-extrs-file
Para usuários que preferem automatizar backups de banco de dados, você precisará buscar a senha do banco de dados no arquivo “~/.my.cnf” através da opção de comando “–defaults-extra-file”. Essa abordagem facilita as coisas para o comando mysqldump quando ele precisa fazer referência ao usuário do banco de dados e à autenticidade da senha. Você tem que ser específico sobre o caminho para o arquivo my.cnf e não apenas usar o símbolo “~”. Considere a seguinte implementação dentro do arquivo crontab:
30 22 * * * mysqldump --defaults-extra-file=/home/system_username/.my.cnf -u root [mysql_database_name] | gzip -c > /var/www_my_backups/[mysql_database_name].sql.gz
Neste exemplo, o crontab é executado todos os dias às 22h30 para criar uma compactação gzip de backup do banco de dados MySQL.
Observação final
Este artigo analisou os mecanismos de backup de banco de dados local sobre o diretório de backup “/var/www_my_backups”. Como agora você entende como o processo de backup ocorre, deve escalar mais alto e começar a pensar em backups externos. No entanto, uma abordagem mais prática é através da configuração de acesso SFTP que aponta para este diretório de backup “/var/www_my_backups”.
Com essa configuração em vigor, é possível criar um trabalho cron SFTP por meio de um servidor remoto para buscar uma cópia desses arquivos de banco de dados armazenados localmente para armazenamento seguro à noite e diariamente.
Ao concluir este incrível guia de artigos, você agora é um mestre orgulhoso dos cenários de backup de banco de dados MySQL, restauração de backup de banco de dados e automação de backup de banco de dados. Agora você deve confiar e confiar no uso de tarefas cron para agendar e lidar com a automação de backup do banco de dados MySQL. Os agendamentos de automação não precisam ser diários, pois também podem ser semanais e mensais.