Unleash Your Potential - Namagunga Girls Coding Club
MariaDB training
1. MariaDB Training
Por Samuel dos Santos Tolentino
Dba Oracle / Sql Server / MySql
samuelsantostolentino@gmail.com
samuel.tolentino@lcs.com.br
Linkedin
2. Conteúdo
Lição 1: Instalação e configuração do MariaDB Pos-instalação
Lição 2: Administração
Lição 3: Banco de dados
Lição 4: Manipulação de dados e estruturas
Lição 5: Índices e estatísticas de tabela
Lição 6: Controle de transações
Lição 7: Gerenciando duplicidade
Lição 8: Métodos de backup e recuperação
Lição 9: Replicação
Lição 10: Auditoria
Lição 11: Procedures , functions e triggers
Lição 12 Tuning SQL: Explain
Apêncices
3. MariaDB Training
Lição 1:Instalação e configuração do MariaDB Pos-instalação
• Instalação do Mariadb
• Atualização
Lição 2: Administração
• Gerenciando usuários e privilégios.
• Arquivo de configuração (my.cnf)
• Comandos administrativos
Lição 3: Banco de dados
• Criação de banco de dados
• Exclusão de banco de dados
4. MariaDB Training
Lição 4: Manipulação de dados e estruturas
• Tipos de dados
• Select, Insert, update, delete
• Expressões Regulares
• Funções simples
• Funções de agrupamento
• Operadores de conjunto (Set operators)
• Sub query
• Operadores IN, ANY, ALL
• Views
• Criação e alteração e esclusão de tabelas
• Instrução Truncate table
• Criação de tabela temporária
• Exclusão de tabela temporária
5. MariaDB Training
Lição 5: Índices e estatísticas de tabela
• Criação de índice
• Exclusão de índice
• Rebuild índice
• Estatísticas de tabela
Lição 6: Controle de transações
• Estrutura das transações
• Commit, Rolback e Start transaction
• Processlist
Lição 7: Gerenciando duplicidade
• Utilizando insert
• Utilizando Insert ignore
• Utilizando Distinct
6. MariaDB Training
Lição 8: Métodos de backup e recuperação
• Ferramentas de backup
• Utilizando Select into out file(Aquivo externo)
Lição 9: Replicação
• Configuração de replicação master-slave
• Configuração de replicação master-master
• Monitoração da replicação
• Troubleshooting de replicação
Lição 10: Auditoria
• Plugins
• Instalação e configuração do audit plugin.
Lição 11: Procedures , functions e triggers
• Visão geral
• Exemplos
Lição 11: Tuning SQL
• Explain
7. Lição 1: Instalação do MariaDB
Os seguintes passos irão mostrar como efetuar a instalação do MariaDB no CentOs 7 utilizando o repositório
MariaDB:
1. Logue no SO com as credenciais de root:
Digite o comando: touch /etc/yum.repos.d/MariaDB.repo <enter>
vi /etc/yum.repos.d/MariaDB.rep <enter>
Adicione o conteúdo abaixo no arquivo:
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
Salve o arquivo.<esc> :wq <enter>
8. Lição 1:Instalação do MariaDB
2. Instale o MariaDB pelo utilitário yum:
sudo yum install MariaDB-server MariaDB-client -y
3. Inicie o serviço:
# systemctl start mariadb ou
# systemctl start mysql
4. Execute o comando mysql_secure_installation para configurar a instância.
[root@localhost ~]# mysql_secure_installation
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
9. Lição 1:Instalação do MariaDB
You already have a root password set, so you can safely answer 'n'.
Change the root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
Remove anonymous users? [Y/n] y
... Success!
Remove test database and access to it? [Y/n] n
... skipping.
Disallow root login remotely? [Y/n] y
... Success!
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
10. Lição 1: Acessando o banco de dados via
command line
Abra o terminal no Linux e digite:
mysql –uroot -p
onde -u indica o usuário e -p a senha conforma abaixo:
[root@teampass ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or g.
Your MariaDB connection id is 64
Server version: 10.0.32-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
MariaDB [(none)]>
11. Lição 1:Alterando o diretório de dados
# vi /etc/selinux/config
...
SELINUX=disabled
...
# reboot
# systemctl stop mysql
# mkdir /mysql
# chown -R mysql:mysql /mysql
# vi /etc/my.cnf
...
datadir=/mysql
...
# cp -R -p -v /var/lib/mysql/* /mysql/
# systemctl start mysql
12. Lição 1: Atualização do MariaDB
Para Atualizara versão do MariaDB basta alterar o repositório do yum (mariadb.repo).
# vi /etc/yum.repos.d/mariadb.repo
Altere a versão no repositório, salve.
[root@teampass ~]# systemctl stop mysql
[root@teampass ~]# sudo yum update (demora mais pois irá atualizar todo o S.O.) ou yum update MariaDB*
[root@teampass ~]# systemctl start mysql
[root@teampass ~]# mysql_upgrade -u root -p
13. Lição 2: Gerenciando Usuários
Sintaxe para criação de usuário no MariaDB:
CREATE USER ben@localhost IDENTIFIED BY 'p@$$w0rd';
Onde: @localhost indica que o usuário ben só pode conectar ao banco de dados a partir do servidor local.
Remoção de usuário:
Drop USER ben;
Renomear usuário:
remane user usuario_a to usuario_b ;
Alterar a senha do usuário:
SET PASSWORD FOR usuario_a = Password('n3w p@$$w0rd');
14. Lição 2: Privilégios
Após a criação da conta de usuário x, para que este possa acessar os objetos dos
bancos de dados é necessário conceder os devidos privilégios.
Exemplo:
grant select, insert, update, delete on database1 to user@localhost;
grant select, insert, update, delete on database1 to user@localhost with grant option;
Flush privileges;
Para verificar os privilégios concedidos a um determinado usuário:
SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
Remover privilégios:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
O comando “show privileges “ mostra os privilégios suportados pelo MariaDB.
Exemplo no próximo slide:
16. Lição 2: Privilégios
Roles
Uma role server para agrupar uma serie de privilégios facilitando o
gerenciamento na concessão e retirada de privilégios.
Sintaxe:
CREATE [OR REPLACE] ROLE [IF NOT EXISTS] role
[WITH ADMIN
{CURRENT_USER | CURRENT_ROLE | user | role}]
Exemplos:
create role developer whith admin smith (cria a role com usuário admin
smith)
grant create table on database1 to developer; (Concede o privilégio de criar
tabela)
GRANT SELECT ON data.* TO developer; (Concede privilegio no banco de dados
data para a role)
grant developer to user1; (Concede acesso a todas a permissões e a role
possui)
drop role developer; (Remove a role do banco de dados)
Documentação:
Grant
Revoke
Roles
Conforme imagem abaixo é preciso executar o
comando set role para que e role tenha efeito.
17. Lição 2: Arquivo de configuração
O arquivo de configuração (my.cnf) é onde são armazenadas as configurações de inicialização da instância,
toda vez que o database é iniciado esse arquivo é lido e os valores das variáveis do sistema são carregados na
instância. A maioria das variáveis podem ser configuradas pelo arquivo my.cnf, mas a maioria não estarão
visíveis no arquivo, quando isso ocorre a instância é inicializada a partir de valores padrão. Algumas variáveis
podem ser alteradas dinamicamente, outras devem ser alteradas no arquivo my.cnf e após reiniciar a
instância.
O caminho padrão desse arquivo é /etc/my.cnf (Linux).
Exemplo de arquivo de configuração:
# Exemplo de arquivo de configuração mysql.
[servidor cliente]
socket = / tmp / mysql-dbug.sock
porta = 3307
# Isso será passado para todos os clientes mysql
[cliente]
senha = my_password
# Aqui estão as entradas para alguns programas específicos
# Os valores a seguir assumem que você tem pelo menos 32M de ram
18. Lição 2: Arquivo de configuração
# O servidor MySQL
[mysqld]
temp-pool
key_buffer_size = 16M
datadir = / my / mysqldata
loose-innodb_file_per_table
[mysqldump]
max_allowed_packet = 16M
[mysql]
no-auto-rehash
loose-abort-source-on-error
Todas as opções do servidor em my.cnf devem ser após a seguinte linha: [mysqld]
O comando “show variables” lista todas as variáveis de sistema.
https://mariadb.com/kb/en/library/server-system-variables/
19. Lição 2: Comandos administrativos
A lista abaixo mostra alguns comandos importantes que são mais utilizados:
Use [database name] : seleciona um database padrão para a sessão atual.
Show databases: lista todos os databases na instância atual.
Show tables: Lista todas as tabelas não temporárias do database atual selecionado.
Show columns from [table] ou describe ou desc [table]:Mostra a estrutura de colunas
da tabela informada.
Show table status like [‘table’]g: Fornece informações de tabelas não temporárias.
Show erros, Show warnings: Exibe erros, avisos e notas.
20. Lição 2: Mysqladmin
O mysqladmin é um utilitário de administração que serve para auxiliar na administração da instância e pode ser
usado para:
• Monitorar o que os clients do MariaDB estão fazendo (lista de processos)
• Obteter estatísticas de uso e variáveis do servidor MariaDB
• Criar / remover bases de dados
• Redefinir logs, estatísticas e tabelas
• Eliminar as consultas em execução.
• Parar o servidor (desligamento)
• Start / stop slaves
• Verificar se o servidor está ativo (ping)
https://mariadb.com/kb/en/library/mysqladmin/
Exemplos:
[root@master ~]# (mysqladmin -uroot -p shutdown Efetua um desligamento limpo na instância)
[root@master ~]# mysqladmin -u root -p create test (Cria um database)
[root@master ~]# mysqladmin -u root -p --relative --sleep=1 extended-status | grep -v " 0 “ (Lista variaveis de systema e
seus valores)
[root@master ~]# mysqladmin -uroot -proot variables | grep datadir (consulta variável de sistema)
[root@master ~]#
21. Lição 3: Criação de banco de dados
Create database sintaxe:
CREATE [OR REPLACE] {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_specification] ...
create_specification:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
Exemplo:
Create database if not exists teste;
MariaDB [(none)]> show create database teste;
+----------+------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------+
| teste | CREATE DATABASE `teste` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)
MariaDB [(none)]>
22. Lição 3: Character set e Collations
Um Character set é conjunto de caracteres enquanto uma Collation são as regras para comparar e classificar um
conjunto de caracteres específico.
Por exemplo, um subconjunto de um conjunto de caracteres pode consistir nas letras A, Be C. Um agrupamento
padrão pode definir estes como aparecendo em uma ordem ascendente de A, B, C.
Se o character set for omitido na criação do database o MariaDB assume por padrão o latin1.
https://mariadb.com/kb/en/library/character-set-and-collation-overview/
23. Licão 3: Alteração e Exclusão do banco de dados
Para excluir o banco de dados:
Sintaxe:
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
Exemplo:
MariaDB [(none)]> Drop database teste;
Query OK, 0 rows affected (0.00 sec)
Para alterar o banco de dados:
Sintaxe:
ALTER {DATABASE | SCHEMA} [db_name]
alter_specification ...
ALTER {DATABASE | SCHEMA} db_name
UPGRADE DATA DIRECTORY NAME
alter_specification:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
Exemplo:
ALTER DATABASE test CHARACTER SET = 'utf8' COLLATE = 'utf8_bin';
24. Lição 4: SQL
O que é SQL?
SQL significa Structure Query Language, ou seja, linguagem de consulta estruturada, que foi desenvolvida
especificamente para comunicação de sistemas de banco de dados:
• Tem o objetivo de fornecer uma forma simples de ler e gravar informações no banco de dados.
• A forma mais utilizada de SQL é o padrão ANSI (American National Standards Institute), embora a maioria dos
SGBDs tenha seu próprio padrão SQL como Oracle e SQL Server, nos últimos anos anos cada vez mais tem se visto
o uso do padrão ANSI.
https://www.ansi.org/about_ansi/introduction/introduction?menuid=1
25. Lição 4: Colunas e Tipos de dados
Coluna: uma coluna é um campo único na tabela. Todas as tabelas possuem uma ou varias colunas. As colunas
podem armazenar diversos tipos de informação como: numéricos, binários, alfanuméricos, long, data e hora
etc.. Para informações detalhadas consulte a documentação do MariaDB.
Linha: os dados são armazenados nas tabelas em forma de linhas, cada registro salvo no banco de dados é
armazenado uma nova linha na tabela.
Null: Quando uma coluna tem a informação null significa a ausência de valor, ou seja, não possui informação
armazenada.
Primary Keys: uma primary key é uma ou um conjunto de colunas cujos valores únicos identificam cada linha na
tabela, os valores de uma primary key não podem se repetir.
Foreign Keys: uma foreign key é uma ou mais colunas que referenciam uma coluna em outra tabela onde a outra
tabela é denominada tabela pai e a tabela que contém a foreign key tabela filho.
Unique Keys: Uma unique key indica que cada registro do campo que está como unique não pode se repetir.
https://mariadb.com/kb/en/library/data-types/
26. Lição 4 Manipulação de dados: Select.
O select statement é um comando utilização para ler dados de uma ou mais tabelas do banco de dados.
Basicamente quando se utiliza o comando select no mínimo duas informações são necessárias: Quais informações
ler do banco e onde estão.
Sintaxe:
27. Exemplos:
Esse exemplo retorna todas as linhas e colunas da tabela customer. Onde * pode ser utilizado para
retornar todos os registros das tabelas.
O exemplo ao lado recupera apenas duas
colunas da tabela, mas todas as linhas
ainda. Para limitar o número de linhas
podemos utilizar a clausula where ou o
comando limit. Exemplo no próximo
slide.
28. O primeiro exemplo acima recupera os dados de um id especificado no where já o segundo traz todos
os registros mas limita o resultado para cinco linhas.
A clausula where é utilizada para dar uma condição para a query no intuito de restringir o número
de registros afetados, ou recuperar apenas registros específicos.
O comando limit apenas limita o número de linhas retornadas
29. Lição 4 Manipulação de dados: Expressões regulares
Expressões regulares permitem que a MariaDB execute uma correspondência de padrões complexos em uma string. Em
muitos casos, a combinação de padrões simples fornecida por LIKE é suficiente.
Exemplo:
https://mariadb.com/kb/en/library/regexp/
Mais: https://mariadb.com/kb/en/library/regexp/
30. Lição 4: Manipulação de dados: insert, update, delete
O comando insert é utilizado para inserir novos registros (linhas) na tabela.
O comando update é utilizado para modificar os valores existentes de um ou mais registros da tabela.
O comando delete é utilizado para apagar uma ou mais registros da tabela.
Exemplos:
MariaDB [(none)]> INSERT INTO customers(cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country,cust_contact,cust_email)
MariaDB [(none)]> VALUES('Pep E. LaPew','100 Main Street','Los Angeles','CA','90046','USA',NULL,NULL);
MariaDB [(none)]> INSERT INTO Customers VALUES(NULL,'Pep E. LaPew','100 Main Street','Los Angeles','CA','90046','USA',NULL,NULL);
MariaDB [(none)]> Update customer set cust_address= ‘new address’ where custid = 1;
MariaDB [(none)]> Update customer set cust_address= ‘new address’ , custname=‘new name’ where custid = 1;
MariaDB [(none)]> Delete from customers where custid=1;
Nota: Muito cuidado! nos comandos delete e update, caso a cláusula where seja omitida, o comando irá apagar ou alterar todos
os registros(linhas) da tabela. Falaremos mais sobre a clausula where nos próximos capítulos.
31. Lição 4 Manipulação de dados: Clausulas like e
order by
A clausula order by é utilizada para ordenar o resultados das consultas que pode ser ascendente por padrão, ou
descendente. A clausula order by deve ser inserida sempre no final da query.
A clausula like é utilizada para comparação de igualdade entre strings, para encontrar um determinado padrão
de string.
Exemplos:
> Select * from customer where first_name like ‘A%’
> Select * from customer where first_name like ‘B_%a’
> Select First_name, Last_name from employess order by first_name desc.
> Select First_name, Last_name from employess order by first_name 2;
32. Lição 4 Manipulação de dados: Joins
Utilizamos Joins quando queremos ler dados em mais de uma tabela. Utilizaremos o padrão ANSI para
exemplificar.
A seguir alguns tipos de joins utilizados:
Inner join: Relacionamento de igualdade entre duas tabelas.
Self join: Auto Relacionamento, ou seja, uma tabela se relacionando com ela mesma.
Left join: Produz um conjunto de resultados com todas as linhas da tabela na "esquerda" (t1) mesmo que
não haja correspondência na tabela da direita. Se nenhuma correspondência for encontrada, todas as
colunas da tabela direita serão definidas com valor NULL.
Right Join: O oposto de left join, produz um conjunto de resultados com todas as linhas na tabela direita
mesmo que não haja correspondência na tabela da esquerda. Se nenhuma correspondência for
encontrada, todas as colunas da tabela da esquerda serão definidas com o valor NULL.
Cross join: produz um conjunto de resultados em que cada linha em cada tabela é unida a cada linha da
outra tabela. Isso também é chamado de produto cartesiano . Na MariaDB, a palavra-chave CROSS pode
ser omitida, pois não faz nada. Qualquer JOIN sem uma cláusula ON ou where resulta em um CROSS
JOIN.
https://mariadb.com/kb/en/library/joining-tables-with-join-clauses/
https://mariadb.com/kb/en/library/more-advanced-joins/
33. Exemplos:
Exemplo join:
Select e.emp_name, d.department_name
from employees e join departments d on e.department_id=d.departmentid;
Exemplo left join;
Select e.emp_name, d.department_name
from employees e left join departments d on e.department_id=d.departmentid;
Exemplo right join
Select e.emp_name, d.department_name
from employees e right join departments d on e.department_id=d.departmentid;
Exemplo self join:
Select e.empname as employee, m empname as manager
from employees e join employees m on e.managerid =m.employeeid
Exemplo cross join:
Select * from departments cross join employees
34. Lição 4 Manipulação de dados: Funções simples
Funções simples são funções criadas no banco de dados para efetuar diversas funções como conversões
de dados numéricos para string, string para data e vice-versa, comparações e manipulação de strings. A
seguir alguns exemplos:
Funcão Descrição
INSTR Retorna a posição do primeiro exemplo de uma subsequência
UPPER Converte o texto para caixa alta(letras maiúsculas)
LOWER Converte o texto para caixa alta(letras minúsculas)
CAST Converte vários tipos de dados, números para texto, data para texto e vice versa
REPLACE Substitui caracteres determinados de uma string.
DATEDIFF Retorna a diferença em dias entre duas datas.
TIMESTAMPDIFF Retorna a diferença entre duas datas em minutos, horas,dias. Essa fução requer 3 parâmetros: o
tipo de dado retornado e data inicio e fim.
CONCAT Junta duas ou mais strings concatenadas.
DATE_FORMAT Ele formata a data de acordo com a cadeia de formato especificado.
SUBSTRING Retorna uma string a partir de uma ou duas posições ex: SUBSTRING(str,pos,len).
36. Lição 4 Manipulação de dados: Funções de
agrupamento.
As funções de agrupamento servem para sumarizar dados fazendo cálculos como soma, média obter valores
máximo e mínimo das colunas sem ter que recuperar todas as linhas. Em conjunto com as funções de
agrupamento utilizamos as clausulas group by e having.
Exemplos:
1 - Select max(salary) from employees;
2 - Select min(id) from employees;
3 - Select count(*), department from cgroup by department;
4 - Select avg(salary) from employees;
5 - Select count(employee_id), department from employees group by department having count(department) > 5;
No exemplo 1 e 2 o a consulta retorna o maior e o menor salário, no exemplo 2 o resultado irá mostrar a contagem de registros da tabela
employees agrupando por departamento.
No exemplo 5 acima a consulta irá retornar a quantidade de empregados por departamento nos departamento que tenham mais
de 5 empregados.
Nota: as colunas que não tem função de grupo devem estar especificadas no group by.
37. Lição 4: Operadores de conjunto
Os operadores de conjunto( set operators) são utilizados com base no livro SQL-99 complete, dessa forma o
conteúdo não se aplica diretamente ao MariaDB. Entre os set operators estão: Union, except e insersect.
<query expression>
{UNION | EXCEPT | INTERSECT}
[ ALL | DISTINCT ]
[ CORRESPONDING [ BY (<Column name list>) ] ]
<query expression>
Exemplos:
SELECT employee_name, salary FROM Employees
UNION
SELECT employee_name, salary FROM EmployeesHist;
SELECT boss_name, salary FROM Bosses
EXCEPT
SELECT employee_name, salary FROM Employees;
SELECT boss_name, salary FROM Bosses
INTERSECT
SELECT employee_name, salary FROM Employees;
38. CREATE TABLE Villas (
county char(5),
acreage DECIMAL(4,2),
price DECIMAL(8));
CREATE TABLE Mansions (
owner char(5),
acreage DECIMAL(4,2),
house_rating INT,
price DECIMAL(8));
villas values(‘Lacombe’,39.00,10000);
Insert into villas values(‘Stettler’,15.78,90000);
Insert into villas values(‘Roseland’,15.77,20000);
Insert into villas values(‘Victoria’,null,null);
Insert into villas values(‘Victoria’,null,null);
Insert into mansions values ('Bodnar',15.77,NULL,200000);
Insert into mansions values ('Melnyk',39.00,15,900000);
Insert into mansions values ('Skoreyko',39.00,0,900000);
Insert into mansions values ('Mudriy',NULL, NULL,NULL);
Exemplos:
SELECT * FROM Villas
UNION DISTINCT
SELECT * FROM Villas
ORDER BY acreage DESC;
SELECT price FROM Villas
EXCEPT ALL
SELECT price FROM Mansions;
SELECT DISTINCT price FROM Villas
EXCEPT ALL
SELECT DISTINCT price FROM Mansions;
SELECT * FROM Villas
INTERSECT CORRESPONDING
SELECT * FROM Mansions;
SELECT acreage, 'Villa' AS type
FROM Villas
UNION
SELECT acreage, 'Mansion' AS type
FROM Mansions;
39. Lição 4: Sub querys
Sub querys são usadas para especificar um valor (uma sub consulta escalar, que retorna um valor), uma linha (a sub
consulta de linha, que retorna uma linha) ou uma Tabela (a sub consulta da tabela, que retorna uma tabela de
resultados) . É possível utilizar sub consultas em colunas no select, na clausula where, having e from.
Exemplos:
SELECT Table_1 . column_1 ,
Table_1 . column_2
FROM Table_1 WHERE Table_1 . column_1 =
( SELECT column_1 FROM Table_2
WHERE Table_2 . column_1 = 5 );
SELECT e.`empname`,(SELECT depname FROM departments
d WHERE d.id= e.`depid` )
FROM employees e (esta sub query é denominada sub query correlacionada
onde a sub consulta será executada para cada resultado
na consulta original)
40. Lição 4: Operadores IN, ANY, ALL, between
Os operadores in, any e all são utilizados na clausula where quando a condição da query tiver mais de um resulado
para comparar.
Exemplo:
SELECT salary FROM employees WHERE salary IN(SELECT AVG(salary) FROM employees GROUP BY depid);
Select salary from employees where salary > any (select AVG(salary) from employees group by departments);
Select salary from employees where salary > all (select AVG(salary) from employees group by departments);
SELECT salary FROM employees WHERE salary between 1000 and 4000;
Onde:
• any retorna registros onde o salário é maior do que o menor valor.
• In retorna retorna registros onde o salário seja igual a algum dos os valores retornados na subconsulta.
• All retorna registros onde o salário é maior do que o maior valor.
• Between retorna registros onde o salário esteja entre 1000 e 4000.
41. Lição 4 Views
Views são consideradas tabelas virtuais, diferente das tabelas que contém dados, as views não possuem dados, as
views possuem queries que retornam os dados dinamicamente quando são utilizadas.
Por que utilizar views?
• Para reuso de consultas SQL;
• Para segurança, restringindo campos da tabela;
• Para simplificar operações sql complexas, uma vez escrita a consulta sql, ela pode ser facilmente utilizada sem a
necessidade de saber os detalhes da consulta.
• Para modificar a formatação das informações, view podem formatar e apresentar dados diferente de como estão
nas tabelas.
42. Sintaxe:
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW [IF NOT EXISTS] view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
Exemplo:
Create or replace view v_name_view as
Select first_name, last_name, phone_number from customer;
Select * from v_name_view;
Nota: Não é possível criar mais de uma view com o mesmo nome, a utilização da palavra replace sobrescreve a view caso
já exista uma com o mesmo nome, já [IF NOT EXISTS] só permite criar a view caso não exista uma view com o mesmo
nome.
43. Criação de view com check option
Por padrão é possível atualizar uma tabela a partir de uma view, desde que na view não contenha joins ou agrupamentos, a
palavra chave with grant option previne a atualização da tabela a partir da view a menos que a clausula where seja
verdadeira.
Exemplo:
Create or replace view v_view_name as
MariaDB [teste]> CREATE VIEW view_check1 AS SELECT * FROM test WHERE cod <100;
CREATE VIEW view_check2 AS SELECT * FROM view_check1 WHERE cod > 10 with local check option;
Esta inserção é bem sucedida, uma vez que view_check2 apenas verifica a inserção contra view_check2, e a cláusula WHERE avalia como
verdadeira ( 150 é maior que10).
CREATE VIEW view_check3 AS SELECT * FROM view_check1 WHERE cod > 10 with cascaded check option;
INSERT INTO view_check3 VALUES (150);
Esta inserção falha, conforme view_check3 verifica a inserção contra ambas view_check3 as views subjacentes. A cláusula
WHERE para view_check1 avalia como falso ( 150 é maior que 10, mas 150 não é maior que100), de modo que a inserção
falha.
O select abaixo mostra se a view é atualizável, ou seja, se é possível manipular os dados da tabela;
MariaDB [teste]> SELECT TABLE_NAME,IS_UPDATABLE FROM INFORMATION_SCHEMA.VIEWS;
| TABLE_NAME | IS_UPDATABLE |
+-------------+--------------+
| view_check1 | YES |
| view_check2 | YES |
| view_check3 | YES |
+-------------+--------------+
3 rows in set (0.01 sec)
44. Lição 4 Criação de tabela
O comando create table cria uma tabela com o nome especificado, para criar tabela é preciso ter privilégio de
create table ou create table no banco de dados especifico.
Sintaxe:
CREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...) [table_options ]... [partition_options]
CREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)] [table_options ]... [partition_options]
select_statement
CREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{ LIKE old_table_name | (LIKE old_table_name) }
select_statement:
[IGNORE | REPLACE] [AS] SELECT ...
Mais detalhes: https://mariadb.com/kb/en/library/create-table/
45. Exemplos:
USE teste;
Create table t1 (id int auto_increment primary key ,
name varchar(20) not null,
phone varchar(20)
);
O script acima cria uma tabela com campo id como chave primaria e auto incremento, ou seja, ao inserir registros não é
preciso informar valor para o campo id, not null indica que o campo não pode ser inserido sem dados.
USE teste;
CREATE TABLE t2 (id INT ,
cod INT,
NAME VARCHAR(20) NOT NULL,
phone VARCHAR(20),
PRIMARY KEY (id,cod)
foreign key (cod) references t1(cod)
);
O script acima mostra a criação da tabela com mais de uma coluna fazendo parte da primary key e criação de foreign key.
46. Lição 4 alteração de estrutura(Alter table)
O comando alter table serve para alterar a estrutura da tabela como por exemplo adicionar ou remover colunas
como também alterar o tipo de dado da coluna, adicionar primary key, foreign Keys
Exemplos:
MariaDB [teste]> use teste;
MariaDB [teste]> alter table t1 add (email varchar(50) ); -- (adiciona uma coluna)
MariaDB [teste]> alter table t2 drop column phone; -- (remove a coluna)
MariaDB [teste]> Alter table t1 modify name varchar(50); -- (modifica o tamanho da coluna)
MariaDB [teste]> alter table t1 add constraint t1_fk foreign key (cod) references t2(cod); --(adiciona foreign key)
MariaDB [teste]> alter table t2 add constraint t2_pk primary key(id); -- (adiciona primary key);
Nota: cada tabela pode conter apenas uma primary key, mas várias foreign keys, pode ter uma ou mais coluna compondo uma
primary key;
Mais exemplos:
https://mariadb.com/kb/en/library/alter-table/
47. Lição 4 Drop e Truncate table
O comando truncate table recria toda a estrutura da eliminando todos os registros, diferente do comando drop
table o truncate não permite que seja efetuado rollback das alterações. Falaremos mais de rollback no capitulo
controle de transações.
Exemplo Drop table:
MariaDB [teste]> use teste;
MariaDB [teste]> drop table test;
Query OK, 0 rows affected (0.01 sec)
Exemplo Truncate table:
MariaDB [teste]> use teste;
MariaDB [teste]> truncate table t1;
ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint (`teste`.`t2`, CONSTRAINT `t2_fk` FOREIGN KEY (`cod`) REFERENCES `teste`.`t1` (`id`))
MariaDB [teste]>
Nota: caso a tabela possua integridade referencial não é permitido executar o comando, nesse caso primeiro deve-se eliminar as foreign na
tabela filho, conforme exemplo abaixo. Caso exista coluna alto increment, a sequencia de incremento é reiniciada.
MariaDB [teste]> alter table t2 drop foreign key t2_fk;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [teste]>
MariaDB [teste]> truncate table t1;
Query OK, 0 rows affected (0.02 sec)
48. Lição 4 tabelas temporárias
Tabelas temporárias quando criadas existem até o termino da sessão atual, após o encerramento da sessão a tabela
é eliminada. Para excluir uma tabela temporária basta executar o comando drop temporary table table_name;
Exemplo:
49. Lição 5: Índices
Índices são utilizados para melhorar a velocidade em que uma consulta é retornada, existem quatro formas de criar
índices: chaves primárias, índices únicos, índices simples e índices de texto completo.
• Índices de Primary key: Toda vez que uma tabela é criada com chave primaria (Primary key), automaticamente é
criado um unique índex na coluna ou nas colunas que compõem a chave primária.
• Índices únicos: quando é criado uma unique key também é criado um índice único na coluna indicada.
• Índices simples: índices de colunas que não são únicas.
• Um índice de texto completo no MariaDB (full text index) é um índice do tipo FULLTEXT, e permite mais opções
ao procurar partes de texto de um campo. Os índices de texto completo podem ser usados apenas com as tabelas
MyISAM e Aria , no MariaDB 10.0.5, com as tabelas InnoDB no MariaDB 10.0.15 e podem ser criadas somente para
colunas CHAR , VARCHAR ou TEXT . As tabelas particionadas não podem conter índices de texto completo,
mesmo que o mecanismo de armazenamento os suporte.
https://mariadb.com/kb/en/library/fulltext-index-overview/
• Nota: Unique índices indicam que as informações nas colunas não podem se repetir tanto em primary Keys como
Unique Keys.
50. Exemplos
Os índices podem ser criados ou adicionados nas tabelas da seguinte forma:
Índices únicos:
MariaDB [hr]> ALTER TABLE Employees ADD UNIQUE `EmpCode`(`employee_id`);
ou
MariaDB [hr]> CREATE UNIQUE INDEX emp_email ON employees(email);
Indices simples:
MariaDB [hr]> CREATE INDEX emp_email ON employees(email);
Para remover índices:
MariaDB [hr]> alter table employees drop index emp_email;
51. Full text index
CREATE TABLE ft2(copy TEXT,FULLTEXT(copy)) ENGINE=MyISAM;
INSERT INTO ft2(copy) VALUES
('MySQL vs MariaDB database'),
('Oracle vs MariaDB database'),
('PostgreSQL vs MariaDB database'),
('MariaDB overview'),
('Foreign keys'),
('Primary keys'),
('Indexes'),
('Transactions'),
('Triggers');
Nesse exemplo, tudo o que está
associado à palavra "banco de dados" é
retornado quando a expansão da consulta
é usada, mesmo que não seja
explicitamente solicitada.
Mais exemplos: https://mariadb.com/kb/en/library/fulltext-index-overview/
52. Lição 5: Rebuild de Índices
Para efetuar o rebuild de índice no MariaDB, deve-se utilizar o comando optimize table que possui duas funções:
Desfragmentar a tabela e atualizar os índices de tabelas, porém tabelas InnoDB não suportam o optimize table.
Portanto o comando abaixo é um atalho para efetuar a organização completa da tabela mais a análise.
Onde o parâmetro –o indica o database.
Nota: O comando optimize table
loca a tabela, logo deve –se ter
cautela ao executar.
53. Lição 5: estatísticas de tabela
A declaração SHOW TABLE_STATISTICS foi introduzida no MariaDB 5.2 como parte do recurso Estatísticas de usuário .
Foi removido como uma declaração separada no MariaDB 10.1.1 , mas efetivamente substituído pela SHOW
information_schema_table declaração genérica .
O comando SHOW TABLE_STATISTICS G tabela mostra as estatísticas sobre o uso da tabela
Exemplo:
54. Lição 6: Controle de transações
"Uma transação SQL (transação) é uma sequência de execuções de instruções SQL que são atômicas em relação à
recuperação. Ou seja, o resultado de execução é completamente bem-sucedido ou não tem efeito em nenhum
efeito.(MariaDB)
O mecanismo de armazenamento InnoDB suporta transações compatíveis com ACID* .
Existem vários comandos para controle de transações no MariaDB. Nesse treinamento iremos falar de:
Commit, Rollback, Start transaction e lock tables.
Commit e Rollback: O comando commit indica o fim de uma transação informando ao banco de dados a instrução
para persistir os dados no disco, já o comando rollback indica exatamente ao contrário, ou seja desfaz
alterações efetuadas por transações que ainda não sofreram commit.
Start transaction: A declaração START TRANSACTION ou BEGIN inicia uma nova transação. COMMIT confirma a
transação atual, tornando suas mudanças permanentes. ROLLBACK desfaz a transação atual, cancelando suas
alterações. O comando SET autocommit desabilita ou habilita o modo de autocommit padrão para a sessão atual.
lock tables: O MariaDB permite que as sessões do cliente adquiram bloqueios de tabela explicitamente com o
objetivo de cooperar com outras sessões para acesso a tabelas ou para evitar que outras sessões modifiquem
tabelas durante períodos em que uma sessão requer acesso exclusivo a elas. Uma sessão pode adquirir ou liberar
bloqueios apenas para si. Uma sessão não pode adquirir bloqueios para outra sessão ou liberar bloqueios
mantidos por outra sessão. https://mariadb.com/kb/en/library/transactions/
* Atomicidade, consistência, isolamento e durabilidade.
55. Lição 6: Processlist
O comando SHOW [FULL] PROCESSLIST mostra quais processos estão em execução. Você também pode obter essas
informações da tabela information_schema.PROCESSLIST ou do comando mysqladmin processlist. Se você tiver o
privilegio PROCESS, você pode ver todos os processos. Caso contrário, você pode ver apenas seus próprios processos
(ou seja, processos associados à conta MariaDB que você está usando). Se você não usar a palavra - chave FULL,
apenas os primeiros 100 caracteres de cada declaração são mostrados no campo Informações.
Exemplo:
56.
57. Lição 7: Gerenciando duplicidade
A duplicidade pode ser a nível de tabela, quando a mesma possui mais de um registro com a mesma informação ou
na forma de select, quando o resultado de uma consulta escrita de forma incompleta implica em linhas duplicadas
no resultado.
O uso de primary keys e e unique Keys evitam que haja duplicidade de informações quando se insere um novo
registro. Para selects com duplicidade podemos utilizar o comando Distinct .
O comando “insert ignore” ignora o erro caso ao tentar inserir um registro duplicado em uma coluna única com
restrição unique.
Exemplos:
58. Lição 8: Métodos de backup e recuperação
No MariaDb é possível efetuar backups lógicos e físicos onde os backups lógicos efetuam backup apenas dos
dados e estruturas dos bancos enquanto que backups físicos efetuam o backup diretamente dos arquivos físicos
no disco.
A ferramenta utilizada para fazer backup no MariaDB é o mysqldump.
Executando um backup simples:
shell> mysqldump db_name > backup-file.sql (Efetua o backup de todo o database)
shell> mysqldump -u root -p PRODUCTS products_tbl > export_file.txt (Efetua o backup de apenas uma tabela especifica)
Executando restauração:
shell> mysql –u -p db_name < backup-file.sql
shell> mysqld -u root -p PRODUCTS products_tbl < export_file.tx
Por padrão o mysqldump loca as tabelas ao efetuar o backup, para evitar que sejam locadas as tabelas utiliza-se o
parâmetro –single-transaction:
Exemplo:
mysqldump -uroot -proot hr > hr.sql --single-transaction
59. Lição 8: Métodos de backup e recuperação
Efetuando select para um arquivo externo:
SELECT * FROM employees INTO OUTFILE ‘emp.txt’;
Este comando gera um arquivo emp.txt no diretório do banco de dados selecionado.
Outras ferramentas de backup:
Percona XtraBackup: a partir da versão 10.1
MariaDB Backup: a partir da versão 10.1
60. Lição 8: Métodos de backup e recuperação
Cold Backup:
# systemctl stop mysql
# mkdir /Backup
# cp -rfvp /var/lib/mysql/ /Backup/
# systemctl start mysql
Para restaurar o backup em outra maquina:
# systemctl stop mysql
Copie o backup da maquina original ou de onde ele está localizado para a maquina onde se deseja restaurar.
# scp -Cr /Backup/mysql/* 192.168.174.141:/var/lib/mysql/
# chown -R mysql:mysql /var/lib/mysql
# setenforce 0
inicie o MySQL.
# systemctl start mysql
61. Lição 9: Replicação
No MariaDB é possível fazer replicação do tipo master-slave onde o master envia as alterações para o slave e multi-
master que significa que o servidor tem vários mestres que se replicam.
O método de sincronização é efetuado de forma assíncrona através do envio de binlogs para os outros servidores
MariaDB o que pode causar inconsistências caso o envio dos logs seja interrompidos por falha de rede por exemplo.
Passos para configurar a replicação master-slave:
1- Configurar as os parâmetros de replicação no arquivo my.cnf:
2- Efetuar backup dos bancos de dados no master e restaurar no slave.
3- Criar usuário que fará a replicação e conceder privilégio.
4- Ativar a replicação a partir do servidor slave.
Passos para configurar a replicação master-master:
1- Configurar as os parâmetros de replicação no arquivo my.cnf em todos servers.
2- Efetuar backup dos bancos de dados no master1 e restaurar no master2.
3- Criar usuário que fará a replicação e conceder privilégio em todos servers.
4- Ativar a replicação a partir do servidor master1.
5- Ativar a replicação a partir do servidor master2.
62. Exemplo master-slave
Servidor master:
[root@master ~]# systemctl stop mysql
Edit my.cnf:
# bind-address = 127.0.0.1
Por padrão o mariadb irá aceitar apenas conexões do host local iremos comentar essa linha
para ser possível receber conexões de outros hosts
server-id = 1
report_host = master
essas variaveis irão receber o id do servidor e hostname e precisam ser únicas.
log_bin = /var/log/mysql/mariadb-bin
log_bin_index = /var/log/mysql/mariadb-bin.index
Enable binary logging.
relay_log = /var/log/mysql/relay-bin
relay_log_index = /var/log/mysql/relay-bin.index
Habilita a criação de arquivos de relay log, os eventos serão lidos no arquivo binlog do
servidor master e escritos no relay-log do servidor slave.
replicate-do-db = testdb
esse parâmetro indica quais databases serão replicados(opcional)
[root@master ~]# systemctl start mysql
[root@master ~]# mysql –uroot -p
MariaDB [(none)]> create user replusr@'%' identified by 'replusr';
MariaDB [(none)]> grant replication slave on *.* to replusr@'%';
MariaDB [(none)]> show master status; (guarde o resultado, será utilizado na habilitação da replicação)
63. Exemplo master-slave
Servidor slave:
[root@master ~]# systemctl stop mysql
Edit my.cnf:
Altere o server-id e o report_host
[root@master ~]# systemctl start mysql
[root@master ~]# mysql –uroot -p
MariaDB [(none)]> create user 'replusr'@'%' identified by 'replusr';
MariaDB [(none)]> grant replication slave on *.* to 'replusr'@'%';
MariaDB [(none)]> STOP SLAVE;
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.174.139', MASTER_USER='replusr',
MASTER_PASSWORD='replusr', MASTER_LOG_FILE='mariadb-bin.000002', MASTER_LOG_POS=630;
MariaDB [(none)]> START SLAVE;
MariaDB [(none)]> SHOW SLAVE STATUS G;
Faça inserts no master e verifique se a replicação está funcionando.
64. Exemplo master-master
Os passos para configuração da replicação multi-master são basicamente os mesmos, o que muda é na hora de
habilitar a replicação nos dois ou mais lados e algumas variáveis a mais utilizadas na replicaçaão:
Server Master 1:
MariaDB [(none)]> STOP SLAVE;
MariaDB [(none)]> CHANGE MASTER ‘master2' TO MASTER_HOST='192.168.174.141', MASTER_USER='replusr',
MASTER_PASSWORD='replusr', MASTER_LOG_FILE='mariadb-bin.000002', MASTER_LOG_POS=630;
MariaDB [(none)]> START SLAVE ‘master1' ;
MariaDB [(none)]> SHOW SLAVE ‘master1' STATUS G;
Server Master 2:
MariaDB [(none)]> STOP SLAVE;
MariaDB [(none)]> CHANGE MASTER ‘master1’ TO MASTER_HOST='192.168.174.139', MASTER_USER='replusr',
MASTER_PASSWORD='replusr', MASTER_LOG_FILE='mariadb-bin.000002', MASTER_LOG_POS=630;
MariaDB [(none)]> START SLAVE ‘master2 ;
MariaDB [(none)]> SHOW SLAVE ‘master2 STATUS G;
Faça inserts dos dois lados e verifique se a replicação está funcionando.
65. Lição 9: Monitoramento da replicação
Alguns comando de replicação:
CHANGE MASTER ['connection_name'] TO .... Isso cria ou modifica uma conexão com um master.
FLUSH RELAY LOGS ['connection_name'] .... Libera ou recarrega os caches de memória usados pelo MariaDB.
RESET SLAVE ['connection_name'] [ALL]. Isso é usado para redefinir a posição de replicação slave ou para remover
um slave permanentemente.
SHOW SLAVE ['connection_name'] STATUS ... Mostra informações de um slave specífico
SHOW ALL SLAVES STATUS.... Mostra informações de todos os slaves.
START SLAVE ['connection_name'...]] Inicia a replicação no slave.
START ALL SLAVES ... Inicia a replicação em todos os slaves.
STOP SLAVE ['connection_name'] ... Para a replicação no slave.
STOP ALL SLAVES ... Para a replicação de todos os slaves.
SHOW MASTER STATUS ... Mostra status do master.
Mais: https://mariadb.com/kb/en/library/replication-commands/
66. Lição 9: Trobleshooting da replicação
Em caso de falha da replicação será necessário refazer a sincronização a partir do master que está consistente.
Tenha certeza de que o slave não esteja efetuando transações nesse momento pois do contrário pode ocorrer perda
de informação.
Restaurando os dados a partir do master.
1- Para bloquear todas as tabelas execute:
MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;
MariaDB [(none)]> Show master status G
Exemplo saída:
MariaDB [(none)]> show master status G
*************************** 1. row ***************************
File: mariadb-bin.000003
Position: 328
mysqldump –uroot –p --add-drop-database test table1 table2 > testdump.sql
MariaDB [(none)]> unlock tables;
* Estas ações serão efetuadas no Master
67. 2- Copie o backup efetuado anteriormente no master e restaure o backup no slave:
MariaDB [(none)]> stop slave;
MariaDB [(none)]> mysql -u root -p my_database < my_database.sql
MariaDB [(none)]> show slave status G
MariaDB [(none)]> flush tables with read lock;
MariaDB [(none)]> show master status;
MariaDB [(none)]> change master to master_log_file=' mariadb-bin.000002 ', master_log_pos=1740;
MariaDB [(none)]> start slave <slave name>;
MariaDB [(none)]> show slave statusG
MariaDB [(none)]> unlock tables;
Outra forma simples de reiniciar a replicação após uma falha:
MariaDB [(none)]> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
MariaDB [(none)]> START SLAVE;
!Porém é preciso verificar se as informações estão consistentes em ambas as bases;
68. Lição 10: Auditoria
Varias funcionalidades utilizadas no MariaDB são adicionas através da instalação de plugins como é o caso do plungin
de auditoria do banco de dados, basicamente o propósito do MariaDB Audit Plugin é registrar a atividade do servidor.
Para cada sessão de cliente, ele registra quem se conectou ao servidor (ou seja, nome de usuário e host), quais
consultas foram executadas e quais tabelas foram acessadas e variáveis de servidor que foram alteradas.
Pelo MariaDB Audit Plugin é possível audita as seguintes ações:
CONNECT: quando o usuário se conecta, desconecta ou se conecta com falhas - incluindo o código de erro.
QUERY : Consultas executadas e seus resultados em texto simples, incluindo consultas falhadas devido a erros de
sintaxe ou permissão.
TABLE : Tabelas afetadas pela execução da consulta
QUERY_DDL : O mesmo que QUERY, mas filtros apenas DDL do tipo consultas ( CREATE, ALTER, DROP, RENAME e
TRUNCATE- exceto CREATE/DROP [PROCEDURE / FUNCTION / USER] e RENAME USER (eles não são DDL) MariaDB
5.5.42, MariaDB 10.0.17 , MariaDB 10.1.4
QUERY_DML: consultas sql, mas filtros única DML-tipo ( DO, CALL, LOAD DATA/XML, DELETE, INSERT, UPDATE,
HANDLER e REPLACE) MariaDB 5.5.42 , MariaDB 10.0.17 , MariaDB 10.1.4
QUERY_DCL: comandos de DCL(Data control language), CREATE USER, DROP USER, RENAME USER, GRANT,
REVOKE,SET PASSWORD. MariaDB 5.5.43 , MariaDB 10.0.18 , MariaDB 10.1.5
Mais detalhes: https://mariadb.com/kb/en/library/mariadb-audit-plugin-log-settings/
69. Configurando o audit plugin:
1- passo conect no mariadb como root
INSTALL PLUGIN server_audit SONAME 'server_audit.so'; <enter>
2- edite o arquivo my.cnf (/etc/my.cnf) com os parâmetros:
plugin-load = server_audit= server_audit.so
server_audit_events = connect,query (ações que serão auditadas)
server_audit_file_path = /var/lib/mysql-logs/audit.log (local onde será gravado os logs de auditoria)
server_audit_file_rotate_size = 10G #set the size of the logfile (tamanho máximo do arquivo de log)
server_audit_logging = ON (Ativa a auditoria)
server_audit_file_rotations = 0 (ativa rotatividade do arquivo de log)
3- Reinicie o MariaDB
4- Configure o nível da auditoria.
MariaDB [(none)]> SET GLOBAL server_audit_events = 'CONNECT,QUERY,TABLE,QUERY_DDL,QUERY_DCL,QUERY_DML';
Query OK, 0 rows affected (0.00 sec)
Inclua as alterações no aquivo my.cnf
server_audit_events=connect,query,table,QUERY_DDL,QUERY_DCL,QUERY_DML
A partir de então todas as ações efetuadas serão gravadas no /var/lib/mysql-logs/audit.log de acordo com o nível
de auditoria configurado.
Nota: Caso haja replicação
configurada e se deseje auditar os
demais servidores o procedimento
deve ser efetuado em cada host.
70. Lição 11: Procedures , functions e triggers
Procedures: Procedures são procedimentos armazenados no banco de dados que podem ter Por padrão,
uma rotina está associada ao banco de dados atual em uso. Para associar um procedimento de forma
explícita a um dado banco de dados, especifique o nome como db_name.sp_name quando você o cria.
Functions: Uma função tem basicamente as mesmas funções de um procedimento, porém
obrigatoriamente a função sempre deverá retornar algum valor. Funções são muito uteis com cálculos,
mas poder retornar qualquer tipo de dado.
Triggers: Triggers são gatilhos que são disparados por eventos que acontecem nas tabelas
(inser,update,delete), para efetuar um conjunto de funções pré-programadas. Triggers podem ser
utilizadas para auditoria gravando logs de ações efetuadas nas tabelas do banco de dados.
71. Exemplo procedure
DELIMITER //
CREATE PROCEDURE simpleproc (out param1 INT)
BEGIN
SELECT COUNT(*) INTO param1 FROM t;
END;
//
DELIMITER ;
CALL simpleproc(@a);
SELECT @a;
+------+
| @a |
+------+
| 1 |
+------+
DELIMITER //
CREATE PROCEDURE simpleproc2 (
OUT param1 CHAR(10) CHARACTER SET 'utf8' COLLATE
'utf8_bin'
)
BEGIN
SELECT CONCAT('a',f1) INTO param1 FROM t;
END;
//
DELIMITER ;
DELIMITER //
CALL simpleproc2(@a);
SELECT @a "resulatado";
Exemplos extraídos da documentação MariaDB
72. Exemplo function
DELIMITER //
CREATE FUNCTION max_salary (dept l ) RETURNS INT RETURN
(SELECT MAX(salary) FROM employees WHERE employees.dept =
dept);
GRANT EXECUTE ON FUNCTION max_salary TO roger;
//
DELIMITER ;
DELIMITER //
CREATE FUNCTION hello (s CHAR(20))
RETURNS CHAR(50) DETERMINISTIC
RETURN CONCAT('Hello, ',s,'!');
//
DELIMITER ;
SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world! |
+----------------+
73. Exemplo trigger
CREATE TRIGGER Books_Delete
AFTER DELETE ON Books /* ver nota (a) */
REFERENCING OLD ROW AS Old /* ver nota (b) */
FOR EACH ROW /* ver nota (c) */
INSERT INTO Books_Deleted_Log
VALUES (Old.title); /* ver nota (d) */
Nota (a): A ação da Trigger deve ser depois, uma vez que a ação Trigger inclui uma instrução SQL-data change.
Nota (b): é convencional usar o alias " Old" ou " Old_Row" para a linha anterior.
Nota (c): A ação será efetuada para cada linha alterada na tabela.
Nota (d): OLD é um alias para o valor antigo da coluna, assim OLD.TITLE é o valor antigo da coluna title.
CREATE TRIGGER Clients_Insert
BEFORE INSERT ON Clients
REFERENCING NEW ROW AS New
FOR EACH ROW
SET New.home_telephone =
COALESCE(New.home_telephone,New.work_telephone);
Exemplos extraídos da documentação do MariaDB
74. Lição 12 Tuning SQL: Explain
A declaração EXPLAIN pode ser usada como sinônimo de DESCRIBE ou como forma de obter informações sobre como
o MariaDB executa uma declaração SELECT(assim como UPDATE e DELETE desde MariaDB 10.0.5):
'EXPLAIN tbl_name‘ é sinônimo de DESCRIBE tbl_name ou SHOW COLUMNS FROM tbl_name
Quando você precede uma declaração SELECT (ou também com MariaDB 10.0.5 , um UPDATE ou um DELETE) com a
palavra-chave EXPLAIN, a MariaDB exibe informações do otimizador sobre o plano de execução da consulta. Ou
seja, MariaDB explica como ele processaria o SELECT, UPDATE ou DELETE incluindo informações sobre como as
tabelas são unidas e em qual ordem.
ANALYZE statement, que executa a consulta, bem como produzindo saída EXPLAIN, e fornece estatísticas reais, bem
como estimadas, está disponível no MariaDB 10.1.0 .
Sintaxe:
EXPLAIN tbl_name ou explain <instrução select>
75. Coluna Descricão
id Número de seqüência que mostra em que tabelas de pedidos são juntas.select_type Que tipo de
SELECTtabela vem.
table Alias nome da tabela. As tabelas temporárias materializadas para sub-consultas são denominadas
<subquery #>
type Como as linhas são encontradas a partir da tabela (tipo de junção).
possible_keys chaves na tabela que podem ser usadas para encontrar linhas na tabela
key O nome da chave que é usada para recuperar linhas. NULL Não foi utilizada nenhuma chave.
key_len Quantos bytes da chave que foi usada (mostra se estamos usando apenas partes da chave de várias
colunas).
ref A referência que é usada como o valor da chave.
rows Uma estimativa de quantas linhas encontraremos na tabela para cada pesquisa de chave.
Extra Informações adicionais sobre esta associação.
Descrição das colunas em explain select
Exemplos no próximo slide:
Quando você precede uma declaração SELECT (ou, a partir do MariaDB 10.0.5 , UPDATE ou DELETE também) com
a palavra-chave EXPLAIN, a MariaDB exibe informações do otimizador sobre o plano de execução da consulta.
Ou seja, MariaDB explica como ele processaria o SELECT, UPDATE ou DELETE incluindo informações sobre como as
tabelas são unidas e em qual ordem. Na tabela abaixo é mostrado a descrição de cada coluna do explain:
76.
77. Explain
A coluna “select_type” pode retornar os seguintes resultados:
DEPENDENT SUBQUERY
DEPENDENT UNION
DERIVED
MATERIALIZED
PRIMARY
SIMPLE
SUBQUERY
UNCACHEABLE SUBQUERY
UNCACHEABLE UNION
UNION
UNION RESULT
Nota: O EXPLAIN pode adquirir bloqueios de metadados da mesma maneira que SELECT faz, pois precisa conhecer
metadados de tabelas e, às vezes, dados também.
78. Explain
A coluna “type” pode retornar os seguintes resultados:
Valor Descrição
All Uma verificação completa de tabela é feita para a tabela (todas as linhas são lidas). Isso é ruim
se a tabela for grande e tiver feito join com uma tabela anterior! Isso acontece quando o
otimizador não conseguiu encontrar nenhum índice utilizável para acessar linhas.
eq_ref Um índice unico é usado para encontrar as linhas. Este é o melhor plano possível para encontrar
a linha.
fulltext Um índice de texto completo é usado para acessar as linhas.
Index_merge Um acesso de 'intervalo' é feito para vários índices e as linhas encontradas são mescladas. A
coluna da chave mostra quais chaves são usadas.
Index_subquery Isso é semelhante ao ref, mas usado para sub-consultas que são transformadas em pesquisas-
chave.
index Uma varredura completa sobre o índice usado. Melhor do que TODOS, mas ainda é ruim se o
índice for grande e a tabela se juntar a uma tabela anterior.
unique_subquery Isso é semelhante ao eq_ref, mas usado para sub-consultas que são transformadas em
pesquisas-chave
79. Explain
A coluna “Extra” pode retornar os seguintes resultados:
Valor Descrição
Distinct Se fosse utilizada otimização distinta (remover linhas duplicadas). Isso é marcado apenas para a última tabela
no SELECT.
Full scan on NULL key A tabela é uma parte da consulta secundária e se o valor que é usado para corresponder a sub-consulta
será NULL, faremos uma verificação de tabela completa.
Impossible HAVING A cláusula HAVING usada sempre é falsa, de modo SELECTque não retornará nenhuma linha.
Impossible WHERE A cláusula WHERE usada sempre é falsa, de modo que o SELECT não retornará nenhuma linha. Por
exemplo: WHERE const_column=5 e const_column teve um valor de 4.
Range
checked for each record (in
dex map: ...)
Isso acontece somente quando não houve um bom padrão de padrão de uso, mas pode haver algum índice que possa
ser usado quando podemos tratar todas as colunas da tabela anterior como constantes. Para cada combinação de
linhas, o otimizador irá decidir qual índice usar (se houver) para buscar uma linha dessa tabela. Isso não é rápido, mas
mais rápido do que uma verificação de tabela completa que é a única outra escolha. O mapa de índice é uma máscara
de bits que mostra qual índice é considerado para cada condição de linha.
Using filesort Uso de order by no select.
Using index Somente o índice é usado para recuperar as informações necessárias da tabela. Não é necessário realizar uma busca
extra para recuperar o registro real.
Using index for group-by O índice está sendo usado para resolver uma consulta GROUP BYou DISTINCT. As linhas não são lidas. Isso é muito
eficiente se a tabela tiver muitas entradas de índice idênticas, pois as duplicatas são rapidamente saltadas.
80. Explain
O explain também pode executar verificação a partir de uma thread ativa, caso essa esteja efetuando alguma ação
passível de otimização o explain recupera a declaração que está sendo executada e gera as informações do
otimizador em tempo real.
Exemplo:
SHOW EXPLAIN FOR 1;
+------+-------------+-------+-------+---------------+------+---------+------+---------+----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+-------+---------------+------+---------+------+---------+----------------------+
| 1 | SIMPLE | tbl | index | NULL | a | 5 | NULL | 1000107 | Using index |
+------+-------------+-------+-------+---------------+------+---------+------+---------+----------------------+
1 row in set, 1 warning (0.00 sec)
Também pode ser utilizado para mostrar os índices que uma tabela possui:
81.
82. Apêndice A: my.cnf
Neste apêndice mostraremos as variáveis mais utilizadas e qual a função essa variável possui:
Todas as variáveis do servidor MariaDB devem ser colocadas logo abaixo da linha [mysqld].
data_dir: Este parâmetro recebe o caminho o diretório para onde serão armazenado os arquivos de dados. O valor
padrão no Linux é /var/lib/mysql.
innodb_buffer_pool_size: Utiliza 80% da memória RAM disponível. Por padrão é inicializado com 70% da mamória.7
innodb_log_file_size: Ajuste esse parâmetro para 20% do tamanho do innodb_buffer_pool_size.
innodb_file_per_table: Este parâmetro identifica quantos arquivos de serão criados para cada tabela innodb, valor
padrão 1.
thread_cache_size: Quantidade de threads que são criadas na inicialização da instância.Este valor pode ser ajustado
dinamicamente.
tmp-table_size, max_heap_table_size: ambos precisam ser ajustados com o mesmo tamanho e previnem escrita em
disco. Ex:
tmp-table_size=1G
max_heap_table_size=1G
max_allowed_packet: valor máximo permitido por pacote, deve ser ajustado para o tamanho do maior pacote no
sistema. Um exemplo é setar 11 vezes o valor do seu maior arquivo BLOB.
83. Variaveis de replicação:
auto_increment_increment , auto_incremente_offset: utiliza as duas em conjunto quando utilizar replicação multi-master,
auto_incremente_offset deve receber um valor único para cada servidor e possui a função de não deixar gerar valores duplicados
em campos auto-increment.
binlog_format: Determina se a replicação é baseada em linha, statement ou ambos. Valor padrão: MIXED(> = MariaDB 10.2.4 )
STATEMENT(<= MariaDB 10.2.3 ).
slave_skip_erros: Quando um erro ocorre a replicação para, esta variável permite que uma lista de códigos de erro ignore e a replicação continue,
Usando all como uma opção permite que o slave continue replicando, independentemente do erro que ele encontre, muito cuidado ao aplicar essa
variável devido possibilidade de inconsistências na replicação.
sync_binlog: O MariaDB sincronizará seu arquivo de log binário com o disco após esses muitos eventos. O padrão é 0, caso em que o sistema
operacional lida com a descarga do arquivo no disco. 1 é a escolha mais segura, mas mais lenta, uma vez que o arquivo é descarregado após cada
gravação. Se o autocommit estiver habilitado, há uma gravação por declaração, caso contrário, há uma gravação por transação.
Mais informações:
https://mariadb.com/kb/en/library/replication-and-binary-log-server-system-variables/
https://mariadb.com/kb/en/library/server-system-variables/
84. Referências
Bem Forta, MariaDB Crash Course, 2011 Ed. Pearson
MariaDB Knowledge Base em https: https://mariadb.com/kb/en/
MySQL 5.7 Reference Manual