MySQL para DBAs Oracle Ricardo Portilho Proni ricardo@nervinformatica.com.br Esta obra está licenciada sob a licença Creative Commons Atribuição-SemDerivados 3.0 Brasil. Para ver uma cópia desta licença, visite http://creativecommons.org/licenses/by-nd/3.0/br/. 1
Por que MySQL? 2 2
Evolução MySQL Fonte: Apresentação Novidades do Universo MySQL, do GUOB Tech Day 2014 3 3
Evolução MySQL Fonte: Apresentação Novidades do Universo MySQL, do GUOB Tech Day 2014 4 4
Evolução MySQL Fonte: Apresentação Novidades do Universo MySQL, do GUOB Tech Day 2014 5 5
Edições 6 6
Edições 7 7
Instalação [root@melquior ~]# yum -y install mysql-server... [root@melquior ~]# rpm -qa grep mysql mysql-server-5.1.73-3.el6_5.x86_64 mysql-libs-5.1.73-3.el6_5.x86_64 mysql-5.1.73-3.el6_5.x86_64 [root@melquior ~]# 8 8
Instalação 9 9
Instalação 10 10
Lab 1: Instalação Instale o MySQL. # yum -y install wget # wget http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm # rpm -ivh mysql-community-release-el6-5.noarch.rpm # yum -y install mysql-server # chkconfig mysqld on # ls -lh /var/lib/mysql # service mysqld start # ls -lh /var/lib/mysql # /usr/bin/mysqladmin -u root password 'Nerv2015' Acesse o MySQL, e verifique a versão instalada. # mysql -u root -pnerv2015 mysql> exit; Verifique o Log do MySQL. # cat /var/log/mysqld.log Verifique o arquivo de parâmetros do MySQL. # cat /etc/my.cnf 11 11
Lab 2: Programas Cliente # mysql -u root -pnerv2015 mysql> SHOW STATUS; mysql> EXIT; # mysql -u root -pnerv2015 -e SHOW STATUS # mysql -u root -pnerv2015 -e SHOW STATUS > status.txt # cat status.txt # echo SHOW STATUS >> script.sql # cat script.sql # mysql -u root -pnerv2015 < script.sql # rm -f status.txt # mysql -u root -pnerv2015 < script.sql > status.txt # cat status.txt # mysqladmin # mysqladmin -u root -pnerv2015 status 12 12
Instância x Banco de Dados 13 13
Engines MyISAM InnoDB Memory CSV Archive Blackhole Merge Federated Example 14 14
Lab 3: Processos e Threads Execute um teste de carga no MySQL. # yum -y install mysql-test # mysqlslap --user=root --password=nerv2015 --auto-generate-sql --concurrency=10 --iterations=10 --number-char-cols=10 --number-int-cols=5 --engine=innodb Durante a execução do teste, acompanhe no Linux, via top. Durante a execução do teste, acompanhe no MySQL, via mysqladmin. # mysqladmin -u root -pnerv2015 status 15 15
Lab 4.1: Parâmetros de otimização Altere todos os parâmetros abaixo no arquivo de parâmetros, e reinicie o MySQL. max_connections = 800 table_open_cache = 100 thread_cache_size = 16 innodb_buffer_pool_size = 128M innodb_thread_concurrency = 32 key_buffer = 128M read_buffer_size = 2M read_rnd_buffer_size = 2M sort_buffer = 2M join_buffer_size = 2M query_cache_type = 1 query_cache_size = 16M query_cache_limit = 2M query_cache_min_res_unit = 4096 16 16
Lab 4.2: Parâmetros de recuperação Altere todos os parâmetros abaixo no arquivo de parâmetros, e reinicie o MySQL. tmp_table_size = 8M tmpdir = /tmp/ slow_query_log_file = /var/log/mysql-slow.log long_query_time = 5 innodb_log_file_size = 32M innodb_log_files_in_group = 7 innodb_log_buffer_size = 64M innodb_flush_log_at_trx_commit = 1 mysql> show variables like '%slow%'; mysql> show variables; set = ALTER SESSION set global = ALTER SYSTEM 17 17
Lab 5: Bancos de Dados Crie um novo banco de dados. # mysql -u root -pnerv2015 mysql> show databases; mysql> create database nerv; mysql> show databases; mysql> use nerv; mysql> show tables; Banco mysql = Schema SYSTEM 18 18
Usuários e Permissões mysql> CREATE USER 'portilho'@'localhost' IDENTIFIED BY 'Nerv2015'; mysql> CREATE USER 'portilho'@'192.168.0.5' IDENTIFIED BY 'Nerv2015'; mysql> CREATE USER 'portilho'@'*' IDENTIFIED BY 'Nerv2015'; mysql> GRANT SELECT ON nerv.teste TO 'portilho'@'localhost'; mysql> GRANT SELECT ON nerv.* TO 'portilho'@'localhost'; mysql> GRANT ALL PRIVILEGES ON *.* TO 'portilho'@'localhost'; Conexão remota $ mysql -u root -pnerv2015 -h 192.168.0.2 Tabela mysql.user = Tabela DBA_USERS 19 19
Estruturas físicas # ls -lh /var/lib/mysql/ total 29M -rw-rw----. 1 mysql mysql 18M Jan 24 14:45 ibdata1 -rw-rw----. 1 mysql mysql 5.0M Jan 24 14:45 ib_logfile0 -rw-rw----. 1 mysql mysql 5.0M Jan 24 14:45 ib_logfile1 drwx--x--x. 2 mysql mysql 4.0K Jan 24 14:43 mysql srwxrwxrwx. 1 mysql mysql 0 Jan 24 14:45 mysql.sock drwx------. 2 mysql mysql 4.0K Jan 24 15:12 nerv drwx------. 2 mysql mysql 4.0K Jan 24 14:43 performance_schema -rw-rw----. 1 mysql mysql 6 Jan 24 14:45 Proni-PC.localdomain.pid -rw-r--r--. 1 root root 112 Jan 24 14:43 RPM_UPGRADE_HISTORY -rw-r--r--. 1 mysql mysql 112 Jan 24 14:43 RPM_UPGRADE_MARKER-LAST drwxr-xr-x. 2 mysql mysql 4.0K Jan 24 14:43 test # ls -lh /var/lib/mysql/nerv/ total 4.0K -rw-rw----. 1 mysql mysql 65 Jan 24 15:12 db.opt 20 20
Lab 6: Tabelas mysql> use nerv; mysql> CREATE TABLE teste (coluna1 int, coluna2 char(50), coluna3 varchar(255)) Engine=InnoDB; mysql> show tables; O que a criação desta tabela alterou nas estruturas físicas? mysql> CREATE TABLE teste2 (coluna1 int, coluna2 char(50), coluna3 varchar(255)) Engine=MyISAM; mysql> show tables; O que a criação desta tabela alterou nas estruturas físicas? mysql> use mysql; mysql> desc user; mysql> desc nerv.teste; innodb_file_per_table 21 21
Lab 7: INSERT, UPDATE, DELETE, SELECT Execute INSERT de 10 registros diferentes nas tabelas que você criou. 22 22
Lab 8: Transações e Isolamento Execute um UPDATE em todas os registros da teste. Abra outra sessão, e execute SELECT em todos os dados da tabela. O que aconteceu? Repita a operação, mas antes do UPDATE, coloque como abaixo. mysql> START TRANSACTION; mysql> UPDATE... O que aconteceu? Execute INSERT,UPDATE, DELETE e SELECT nas tabelas que você criou. 23 23
Lab 9: System States Execute novamente o teste de carga, e acompamnhe pelos comandos abaixo. mysql> SHOW PROCESSLIST; mysql> SHOW FULL PROCESSLIST; http://dev.mysql.com/doc/refman/5.6/en/general-thread-states.html 24 24
Lab 10: Importação e Exportação Exemplos SELECT * FROM Cars INTO OUTFILE '/tmp/cars.txt'; LOAD DATA INFILE '/tmp/cars.txt' INTO TABLE Cars; SELECT * FROM Cars INTO OUTFILE '/tmp/cars.csv' FIELDS TERMINATED BY ','; LOAD DATA INFILE '/tmp/cars.csv' INTO TABLE Cars FIELDS TERMINATED BY ','; Execute este procedimento para as tabelas que você criou. 25 25
Lab 11: Bin Logs Adicione no /etc/my.cnf a linha abaixo, e reinicie o mysql. log-bin=mysql-bin O que aconteceu no diretório de dados? expire_logs_days 26 26
Lab 12: Backup MyISAM Coloque uma tabela MyISAM em LOCK, e a copie para outro diretório. LOCK TABLE teste2 WRITE; FLUSH TABLE teste2; Execute a cópia pelo sistema operacional. # cp -rf /var/lib/mysql/nerv /root UNLOCK TABLEs; 27 27
Lab 13: mysqldump Execute um backup via mysqldump. $ mysqldump -u root -pnerv2015 nerv > nerv.sql $ mysqldump -u root -pnerv2015 --all_databases > nerv01.sql Edite o arquivo gerado. O que ele contém? Como utilizar este backup? Quais suas desvantagens? 28 28
Lab 14: INFORMATION_SCHEMA Verifique as tabelas do banco de dados INFORMATION_SCHEMA. Quantas tabelas você possui em todo o MySQL? E em seu banco de dados? 29 29
Lab 15: System Status Execute no MySQL o comando abaixo. mysql> SHOW STATUS; Que informações que este comando gera são úteis? 30 30
Alta Disponibilidade MySQL Replication 31 31
MySQL Replication Master mysql> CREATE USER 'replicator'@'192.168.0.2' IDENTIFIED BY 'Nerv2015'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'192.168.0.3'; mysql> FLUSH TABLES WITH READ LOCK; mysql> SHOW MASTER STATUS; Backup no Master / Restore no Slave mysql> UNLOCK TABLES; Slave mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.4', MASTER_USER='replicator', MASTER_PASSWORD='Nerv2015', MASTER_LOG_FILE='mysql-bin.000087', MASTER_LOG_POS=197872700; mysql> START SLAVE; mysql> SHOW SLAVE STATUS; 32 32
Alta Disponibilidade MySQL Proxy 33 33
Alta Disponibilidade MySQL Cluster 34 34
Alta Disponibilidade MySQL Fabric 35 35
Documentação / Livros Documentação oficial http://dev.mysql.com/doc/refman/5.0/en/index.html http://dev.mysql.com/doc/refman/5.1/en/index.html http://dev.mysql.com/doc/refman/5.5/en/index.html http://dev.mysql.com/doc/refman/5.6/en/index.html http://dev.mysql.com/doc/refman/5.7/en/index.html Livros MySQL 5.0 Certification Study Guide High Performance MySQL (O'Reilly) 36 36
Certificações Oracle Certified Professional, MySQL 5.6 Database Administrator Oracle Certified Professional, MySQL 5.6 Developer 37 37