sábado, 9 de setembro de 2017

Alterando o Datadir no MySQL

Por padrão os arquivos de dados do MySQL são criados no diretório /var/lib/mysql, no momento da instalação os bancos de dados, diretórios e arquivos são criados e ficam hospeados neste local, porém em grandes ambientes onde a administração é feita por mais de uma pessoa, e existem pessoas e papeis distintos essa configuração pode não ser a melhor, pois o diretório /var é responsabilidade do Sysadmin, neste tutorial vamos alterar o datadir, que é a variável de sistema que controla o direcionamento dos arquivos de dados do MySQL.

De Para


De:    /var/lib/mysql
Para:  /mysql_datadir/databases


1. Owner e grupo


O owner e o grupo do diretório de destino devem ser obrigatóriamente mysql:mysql


2. SE Linux


Esse foi um ponto que eu me atrapalhei muito, o SE Linux é uma feature do Linux que permite fazer o controle de acesso baseado em politicas, portanto se o SELinux estiver habilitado fará com que o MySQL não consiga escrever no Datadir fora do /var/lib/mysql, temos duas saidas, desabilitar o SELinux ou configurar a permissões necessárias para  escrita do MySQL no novo diretorio.


2.1 Verificando se o SELinux esta habilitado:


[root@ol7-mysql57-slave1 mysql_datadir]# getenforce
Enforcing
[root@ol7-mysql57-slave1 mysql_datadir]#

Portanto o SE Linux esta habilitado.


2.2 Desabilitando o SE Linux:


Editar o arquivo /etc/selinux/config configurando a variavel, SELINUX para disabled e reinciar o servidor:

[root@ol7-mysql57-slave1 mysql_datadir]# cat /etc/selinux/config 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 

2.3 Configurando o SE Linux:


O seguinte artigo resolveu todos os meus problemas e escrive esta pagina baseado nele, blogs.oracle.com/jsmyth/selinux-and-mysql.

Até onde eu entendi o SELinux funciona através de grupos ou objetos, esses um usuário ou grupo de usuários possuem permissões em objetos, assim além da permissão no diretório ou arquivo precisamos configurar a lista de acesso no SE linux.

O comando semanage é o utilitário para escrever as politicas no arquivo de contexto sem a necessidade edita-lo manualmente, para no caso utlizaremos o comando:

semanage fcontext -a -t mysqld_db_t "/mysql_datadir/databases(/.*)?"

Na sequencia devemos forçar a reileitura dos arquivos e diretório (objetos) conforme a politica aplicada no arquivo de contexto, após esse comando é necessário realizar o boot do servidor:

restorecon -Rv /mysql_datadir/databases

Podemos configurar os arquivos sem necessidade de boot com o comando chcon conforme abaixo:

chcon -Rt mysqld_db_t /mysql_datadir/databases
chcon -Ru system_u /mysql_datadir/databases


Outros objetos do SELinux:


Objeto Funcionalidade
mysqld_port_t Porta TCP
mysqld_db_t Arquivos de dados
mysqld_etc_t Arquivo de inicialização
mysqld_log_t Arquivos de Log

Portanto com o SELinux habilitado para alterar qualquer caracteristica padrãod o MySQL devemos configurar estes objetos dentro do SELinux conforme desejado.


3. Movendo o Datadir


3.1 Parar o mysql


service mysqld stop

3.2 Copiar os arquivos de origem para o destino:


rsync -vhrog /var/lib/mysql/* /mysql_datadir/databases

3.3 Editar o arquivo /etc/my.cnf


De:     datadir=/var/lib/mysql
Para:   datadir=/mysql_datadir/databases

3.4 Iniciar o MySQL


service mysqld start


3.5 Para validar:


mysql -u root -p
show variables like "%DATA%";

mysql> show variables like "%DATADIR%";
+---------------+---------------------------+
| Variable_name | Value                     |
+---------------+---------------------------+
| datadir       | /mysql_datadir/databases/ |
+---------------+---------------------------+
1 row in set (0.01 sec)

mysql> 

Nenhum comentário: