MySQL 5.6 replicação com GTID – Global Transaction ID

Fala galera, No inicio deste mês, a Oracle lançou a nova versão do MySQL, a versão 5.6, uma das melhorias foi a introdução do GTID (ID de transação Global).

GTID é um identificador único que sera adicionado a cada transação executada no servidor, e vai ter grande utilidade para o slave, garantindo que mais de uma thread nao execute a mesma transação e também auxiliar quanto a posição que o slave busca e executa dados do master (previamente tínhamos que setar MASTER_LOG_FILE e MASTER_LOG_POS quando iniciavamos o slave).

Vamos intender algumas novas configuracoes que teremos que adicionar no nosso arquivo de configuracao:

gtid-mode : vai habilitar GTID, temos que habilitar log-bin e log-slave-updates para esta opcao funcionar
enforce-gtid-consistency : vai garantir que somente comandos que podem ser replicados sejam executados (mais informações aqui)

Basicamente o que precisamos é isso, para este tutorial vou usar 2 maquinas virtuas black(master – 192.168.1.110), white (slave – 192.168.1.111), meu arquivo de configuração segue abaixo:

black.cnf

[mysqld]
...
binlog-format=MIXED
log-bin
log-slave-updates=true
gtid-mode=on 
enforce-gtid-consistency=true 
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
binlog-checksum=CRC32
master-verify-checksum=1
server-id=1
report-host=black

white.cnf

[mysqld]
...
binlog-format=MIXED
log-slave-updates=true
log-bin
gtid-mode=on 
enforce-gtid-consistency=true 
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=2
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
server-id=2
report-host=white

Próximo passo é criar o usuário de replicação no master (black)

GRANT REPLICATION SLAVE ON *.* TO replication@192.168.1.111 IDENTIFIED BY 'reppwd';
FLUSH PRIVILEGES;

Caso o seu servidor contenha dados, voce pode seguir este post para criar um backup do seu master, note que agora quando rodamos o comando SHOW MASTER STATUS; temos uma coluna chamada Executed_Gtid_Set.

Caso seja o caso, restore o backup no slave.

Vamos então, iniciar a replicação, o bacana é que antes tínhamos que indicar o arquivo binário e a posição, veja como fica simples agora com GTID:

CHANGE MASTER TO MASTER_HOST='192.168.1.110', MASTER_USER='replication', MASTER_PASSWORD='reppwd', MASTER_AUTO_POSITION=1;
START SLAVE;

pronto, neste momento você já deve ter sua replicação com GTID funcionando, vamos conferir com o comando abaixo:

white>show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.110
                  Master_User: replication
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: black-bin.000002
          Read_Master_Log_Pos: 936
               Relay_Log_File: white-relay-bin.000003
                Relay_Log_Pos: 1146
        Relay_Master_Log_File: black-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 936
              Relay_Log_Space: 1560
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 2671c08b-7cf0-11e2-ac39-00163ebee7c2
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 2671c08b-7cf0-11e2-ac39-00163ebee7c2:1-4
            Executed_Gtid_Set: 2671c08b-7cf0-11e2-ac39-00163ebee7c2:1-4
                Auto_Position: 1
1 row in set (0.00 sec)

Os campos Retrieved_Gtid_Set e Executed_Gtid_Set mostram a transação lida do master, e a transação executada no slave.
Para conferir se a replicação esta funcionando, vamos digitar no master:

black> CREATE DATABASE gtid_test;
Query OK, 1 row affected (0.00 sec)

black> use gtid_test;
Database changed
black> CREATE TABLE test (id INT NOT NULL PRIMARY KEY);
Query OK, 0 rows affected (0.00 sec)

black> INSERT INTO test (id) VALUES (1), (2), (3), (4), (5);
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

black> 

e agora, vamos conferir se estes registros estao no slave:

white> USE gtid_test;
Database changed
white> SELECT * FROM test;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
+----+
5 rows in set (0.00 sec)

white>

Isso aew, temos nossa replicacao rodando com Global Transaction ID

Gostou ? Ajude e Compartilhe!
Publicado em backup, binlog, instalação, replicacao | 2 Comentários

Snapshot – backup consistente no MySQL

Hoje vamos falar de como realizar um backup (snapshot) consistente do nosso banco de dados.
Primeiramente, em qual situações podemos utilizar o snapshot?

1. Digamos que seu servidor de produção vai ser partir de hoje replicado em um slave, como você faz essa carga inicial de dados no slave? qual era a posição do bin log quando o backup iniciou, durante o período de backup, sera que alguém enviou alguma query para o banco? e se o bin log esta numa posição diferente da de quando o backup iniciou?

2. Caso você queira implementar uma estrategia de backup incremental, você pode fazer uma copia integra da base uma vez na semana, e caso necessite restaurar a base, aplicar os bin logs a partir da copia.

Dito isso, vamos ao que nos interessa.
Para garantir a integridade vamos precisar trabalhar em 2 sessões, a primeira vai ser responsável por garantir a integridade (vamos dar lock em todos os bancos) e a segunda sera responsável pela copia dos dados.

Então, vamos iniciar:

Sessao 1:

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

Você devera receber um retorno igual a este:

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      107 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

IMPORTANTE: DEIXE ESTA SESSÃO ABERTA DURANTE TODO O PROCESSO, SE VOCÊ FECHAR ESTA SESSÃO, O LOCK DO BANCO SERA SOLTO.

para realizar o backup vamos utilizar o mysqldump:
Sessao 2:

mysqldump -u usuario -p --all-databases > all_dbs.sql

feito isso, assegure-se de que o backup tenha terminado e o dump termine com:
— Dump completed on xxxx-xx-xx xx:xx:xx

pronto, podemos liberar o lock da sessão 1:

UNLOCK TABLES;

Pronto, já temos o snapshot do nosso banco de dados.

Gostou ? Ajude e Compartilhe!
Publicado em backup | 2 Comentários

Replicação em MySQL com SSL

Hoje vamos dar continuidade a replicação, você pode ler o primeiro post sobre este tema aqui

Primeiramente vamos criar os certificados SSL:

Certificado CA:

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem

Certificado do servidor

openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

Certificado do Cliente

openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem

copy ca-cert.pem, client-req.pem, client-cert.pem to slave server

Vamos ajustar o arquivo de configuração do MySQL:

ssl
ssl-ca=/etc/mysql/sslcerts/ca-cert.pem
ssl-cert=/etc/mysql/sslcerts/server-cert.pem
ssl-key=/etc/mysql/sslcerts/server-key.pem

Não esqueça de reiniciar o serviço do MySQL, vamos verificar se esta tudo ok com o SSL

mysq> SHOW VARIABLES LIKE '%ssl%';
+---------------+-------------------------------------+
| Variable_name | Value                               |
+---------------+-------------------------------------+
| have_openssl  | YES                                 |
| have_ssl      | YES                                 |
| ssl_ca        | /etc/mysql/sslcerts/ca-cert.pem     |
| ssl_capath    |                                     |
| ssl_cert      | /etc/mysql/sslcerts/server-cert.pem |
| ssl_cipher    |                                     |
| ssl_key       | /etc/mysql/sslcerts/server-KEY.pem  |
+---------------+-------------------------------------+
7 rows IN SET (0.00 sec)

Feito isso, vamos criar um usuário para fazer a replicação, note que vamos especificar que este usuário tem que se conectar através de uma conexão com ssl:

GRANT REPLICATION SLAVE ON *.* TO 'user'@'178.77.90.38' IDENTIFIED BY 'PASSWORD' REQUIRE SSL;
FLUSH PRIVILEGES;

Ok, terminamos de trabalhar no Master, vamos agora ao Slave:

Vamos ajustar o arquivo de configuração do MySQL:

ssl
ssl-ca=/etc/mysql/sslcerts/ca-cert.pem
ssl-cert=/etc/mysql/sslcerts/client-cert.pem
ssl-key=/etc/mysql/sslcerts/client-key.pem

Vamos verificar se esta tudo ok com o SSL no Slave:

mysq> SHOW VARIABLES LIKE '%ssl%';
+---------------+-------------------------------------+
| Variable_name | Value                               |
+---------------+-------------------------------------+
| have_openssl  | YES                                 |
| have_ssl      | YES                                 |
| ssl_ca        | /etc/mysql/sslcerts/ca-cert.pem     |
| ssl_capath    |                                     |
| ssl_cert      | /etc/mysql/sslcerts/client-cert.pem |
| ssl_cipher    |                                     |
| ssl_key       | /etc/mysql/sslcerts/client-KEY.pem  |
+---------------+-------------------------------------+
7 rows IN SET (0.00 sec)

E finalmente iniciar a replicacao!

CHANGE MASTER TO MASTER_HOST='xxxxxx', MASTER_USER='user', MASTER_PASSWORD='PASSWORD', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=0, MASTER_SSL=1, MASTER_SSL_CA = '/etc/mysql/sslcerts/ca-cert.pem', MASTER_SSL_CERT = '/etc/mysql/sslcerts/client-cert.pem', MASTER_SSL_KEY = '/etc/mysql/sslcerts/client-key.pem';
START SLAVE;
Gostou ? Ajude e Compartilhe!
Publicado em MySQL, password, replicacao, Security | 2 Comentários

Como renomear tabelas no MySQL

Para renomear uma tabela no MySQL você só precisa rodar um comando chamado RENAME TABLE, a sintaxe é bastante simples:

RENAME TABLE tb1 TO tb2;

O comando RENAME TABLE vai renomear a tabela atomicamente, o que significa que a tabela ficara travada durante o comando.
Você também pode renomear varias tabelas em um único comando:

RENAME TABLE tb1 TO tb2, tb3 TO tb4;

Para renomear uma tabela, você vai precisar dos privilégios ALTER e DROP na tabela antiga e CREATE e INSERT na tabela nova.

Você só precisa ter cuidado caso você utilize TRIGGERS, no exemplo abaixo, depois de inserir um registro na tabela Cities eu conto +1 no NOfCities na tabela Countries, o que acontece se eu renomear a tabela Contries?

mysql> SHOW TRIGGERS\G
*************************** 1. row ***************************
             Trigger: PlusOneCities
               Event: INSERT
               Table: Cities
           Statement: UPDATE Countries SET NOfCities = NOfCities + 1 WHERE Code = NEW.CountryCode
              Timing: AFTER
             Created: NULL
            sql_mode: 
             Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)

mysql> INSERT INTO Cities SET Name = 'City1', CountryCode = 'BRA', District = 'Brasilia', Population = 10000;
Query OK, 1 row affected (0.04 sec)

mysql> RENAME TABLE Countries TO Country;
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO Cities SET Name = 'City2', CountryCode = 'BRA', District = 'Brasilia', Population = 10000;
ERROR 1146 (42S02): Table 'world.Countries' doesn't exist

Viu, vamos precisar alterar manualmente as TRIGGERS.

você pode encontrar mais informações na Documentação do MySQL

Gostou ? Ajude e Compartilhe!
Publicado em Uncategorized | 5 Comentários

Usando MySQL IN AND OR

MySQL IN??? MySQL OR??? MySQL AND???
Quando eu uso um e quando eu uso outro?

Vamos usar a tabela City para este tutorial:

+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   | MUL |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int(11)  | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+



Vamos ver umas regras simples para uso:

AND – agente usa AND pra adicionar uma condição que precisa ser verdadeira:

SELECT * FROM City WHERE CountryCode = 'BRA' AND Population > 1000000 AND District LIKE 'São Paulo';

Essa consulta vai retornar as cidades com ContryCode BRA e População maior que 1000000 e District igual a São Paulo, as três condições precisam ser verdadeiras.

OR – agente usa OR pra adicionar uma condicao que ou uma ou outra tem que ser verdadeiras:

SELECT * FROM City WHERE Population > 1000000 OR District LIKE 'São Paulo';

Esta consulta vai retornar Cities que tem população maior que 1000000 ou tem district igual a São Paulo
IN – agente usa IN da mesma maneira que usamos OR, mas para a mesma coluna:

SELECT * FROM City WHERE CountryCode = 'USA' OR CountryCode = 'BRA' OR CountryCode = 'IRL';
SELECT * FROM City WHERE CountryCode IN ('USA', 'BRA', 'IRL');

As duas consultas vao retornar o mesmo resultado, cities que estão em USA, BRA ou IRL.

Gostou ? Ajude e Compartilhe!
Publicado em Uncategorized | 2 Comentários

Gravar sessao no MySQL

Hoje vamos ver uma opção muito útil do comando mysql que ira gravar tudo o que digitarmos no console e também o retorno recebido. Eh a opção –tee. Para usar é fácil, basta adicionar o –tee=/caminho/do/arquivo

mysql -u root -p --tee=/tmp/log.mysql

Por hoje é só pessoal.

Gostou ? Ajude e Compartilhe!
Publicado em Uncategorized | Deixe um comentário

Formatar data no MySQL usando date format

Fala galera, hoje vamos falar sobre como formatar datas no MySQL.
Para este tutorial, estou usando o mysql server 5.5
Basicamente o que você precisa saber e utilizar a função DATE_FORMAT do mysql
vamos criar uma tabela e popular ela com algumas datas:

CREATE TABLE IF NOT EXISTS `dates` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

INSERT INTO `dates` (`id`, `date`) VALUES
(1, '2012-10-17 13:39:55'),
(2, '2012-10-09 09:23:11'),
(3, '2012-08-24 16:47:07');

Beleza? então agora vamos restaurar esse valores e exibi-los de forma correta:

SELECT id, DATE_FORMAT( `date` , '%d/%c/%Y %H:%i:%s' ) AS `date` FROM `dates`

Fácil NE? lembrando que o formato da data sempre sera %LETRA onde letra corresponde ao campo que você deseja exibir (veja lista completa na documentação)

Gostou ? Ajude e Compartilhe!
Publicado em MySQL | 3 Comentários

Trocando a senha do usuario no MySQL

Hoje vamos falar sobre como alterar a senha de usuários no MySQL

Utilizaremos 2 métodos, 1 – mysqladmin, 2 – linguagem SQL

Este é um video com o passo a passo utilizado neste post:

1. mysqladmin:

A sintaxe do comando e simples:

 mysqladmin -u USER -p password NEWPASSWORD 

vamos então alterar o password do usuário ‘marcelo’ para ‘123’

mysqladmin -u marcelo -p password '123'

existem 3 inconvenientes de utilizar este comando para alterar o usuário:

. você poderá somente alterar seu próprio usuário

. você precisa de SUPER PRIVILEGIOS para executar este comando

. caso você compartilhe a conta de usuário com outros users, você logara este comando no histórico, para isso podemos editar o ~/.bash_history e deletar as linhas onde o password e exibido.

2. Linguagem SQL (minha preferida):

para alterar a senha, vamos simplesmente dar um update na tabela de usuários do banco de dados mysql, este comando tem duas variações, ambas tem o mesmo resultado

SET PASSWORD FOR 'user'@'host' = PASSWORD('newpass');

ou

UPDATE mysql.user SET Password=PASSWORD('newpass') WHERE User='user' AND Host='host'; 

depois de rodar o comando acima, devemos rodar um FLUSH PRIVILEGES para que o mysql releia a tabela de usuários, fazendo assim valer a senha nova

Vamos alterar a senha do usuário ‘marcelo’ para ‘123’

UPDATE mysql.user SET Password=PASSWORD('123') WHERE User='marcelo' AND Host='localhost';

FLUSH PRIVILEGES;

Se você estive utilizando o programa proprietário do mysql, você também terá o mesmo problema do mysqladmin, o histórico, para esconder o comando que você rodou e possui a senha legível para humanos, basta você deletar esta linha em ~/.mysql_history

Isso aew pessoal, espero que gostem, em caso de duvidas, comentem!

Gostou ? Ajude e Compartilhe!
Publicado em MySQL, password | 8 Comentários

Utilizando o MySQL FullText Index Search

Hoje vamos falar sobre um recurso muito útil no MySQL, o Full Text Index e Search.

Um recurso muito poderoso que hoje nas versões 5.5 esta disponível apenas para a Engine MyISAM mas como podemos ver na documentação do FullText no site do MySQL, nas versoes 5.6 estará também disponível para InnoDB.

Normalmente quando se quer procurar uma palavra ou expressão em uma coluna usamos o LIKE CORINGA EXPRESSAO CORINGA (LIKE ‘%EXPRESSAO%’) caso estejamos procurando por 2 palavras ficaria LIKE ‘%PALAVRA1%PALAVRA2%) o que muita gente não sabe e que este processo eh custoso para o mysql e não performatico, para estes casos podemos usar o FullText index.

O comando eh simples MATCH() … AGAINST (), onde MATCH especificamos a(s) coluna(s) que desejamos procurar, sim, podemos utilizar o full text para procurar em mais de uma coluna, desde que todas as colunas dentro do MATCH esteja especificadas no índice e AGAINST e onde especificamos a(s) palavra(s) que queremos procurar, podemos especificar também o modo de procura, que vou falar mais tarde neste artigo.

Vamos criar a nossa tabela e colocar a mão na massa:

CREATE TABLE `articles` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(200) DEFAULT NULL,
`body` text,
PRIMARY KEY (`id`),
FULLTEXT KEY `title` (`title`,`body`)
) ENGINE=MyISAM;
INSERT INTO `articles` VALUES (1,'MySQL Tutorial','DBMS stands for DataBase ...'),(2,'How To Use MySQL Well','After you went through a ...'),(3,'Optimizing MySQL','In this tutorial we will show ...'),(4,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),(5,'MySQL vs. YourSQL','In the following database comparison ...'),(6,'MySQL Security','When configured properly, MySQL ...');

Vamos fazer nossa primeira consulta, procurando por artigos que abordem ‘database’

mysql> select * from articles WHERE MATCH(title,body) AGAINST ('database');

+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
+----+-------------------+------------------------------------------+
2 rows in set (0.01 sec)

Vamos agora procurar por ‘database tutorial’

mysql> select * from articles WHERE MATCH(title,body) AGAINST ('database tutorial');

+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
|  3 | Optimizing MySQL  | In this tutorial we will show ...        |
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
+----+-------------------+------------------------------------------+
3 rows in set (0.01 sec)

Agora vamos procurar por artigos que abordem o tema ‘MySQL’, detalhe, todos os artigos em nossa tabela contem a palavra MySQL

mysql> select * from articles WHERE MATCH(title,body) AGAINST ('MySQL');

Empty set (0.00 sec)

Por que? Vamos então falar sobre modos de busca, por padrão, o MySQL utiliza o modo de busca ‘Natural Language’ que nos diz que se a palavra procurada estiver presente em 50% ou mais linhas a consulta não vai bater.

Outra função interessante e que o MySQL nos permite trocar o modo de busca, vamos então repetir a consulta em modo Booleano:

mysql> select * from articles WHERE MATCH(title,body) AGAINST ('MySQL' IN BOOLEAN MODE);

+----+-----------------------+------------------------------------------+
| id | title                 | body                                     |
+----+-----------------------+------------------------------------------+
|  1 | MySQL Tutorial        | DBMS stands for DataBase ...             |
|  2 | How To Use MySQL Well | After you went through a ...             |
|  3 | Optimizing MySQL      | In this tutorial we will show ...        |
|  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ...      |
|  5 | MySQL vs. YourSQL     | In the following database comparison ... |
|  6 | MySQL Security        | When configured properly, MySQL ...      |
+----+-----------------------+------------------------------------------+

6 rows in set (0.00 sec)

Ok, mas o que muda entre um e outro? pra que serve o modo booleano? Como o nome já diz, true or false, vamos fazer uma busca por ‘database’ mas eu não quero que sejam exibidas linhas que contenham a palavra tutorial, complicou? não, veja como:

mysql> select * from articles WHERE MATCH(title,body) AGAINST ('+database -tutorial' IN BOOLEAN MODE);

+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
+----+-------------------+------------------------------------------+
1 row in set (0.01 sec)

Por hoje e só, no próximo artigo, vamos abordar mais a fundo o modo Booleano, alterando a ordem de relevância

Gostou ? Ajude e Compartilhe!
Publicado em index, MySQL, performance | 31 Comentários

como renomear database em MySQL?

Hoje vamos falar de como voce pode facilmente renomear um database em MySQL,

Na versao 5.1.7 do MySQL foi adicionado um comando próprio para fazer isso chamado RENAME DATABASE

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

Porém ele foi retirado na versão 5.1.23 pois poderia resultar em perda de dados, como consta neste link da documentação do MySQL

Então vamos ver algumas formas de tornar esse processo possível:

1. Utilizando o comando RENAME TABLE:

As long as two databases are on the same file system, you can use RENAME TABLE to move a table from one database to another:

RENAME TABLE current_db.tbl_name TO other_db.tbl_name;

RENAME TABLE Syntax na Documentacao do MySQL

mysql> show tables;
+---------------------+
| Tables_in_oldSchema |
+---------------------+
| tb1                 |
| tb10                |
| tb2                 |
| tb3                 |
| tb4                 |
| tb5                 |
| tb6                 |
| tb7                 |
| tb8                 |
| tb9                 |
+---------------------+
10 rows in set (0.00 sec)

Vamos realizar uma consulta para retornar um comando que possamos rodar nosso ALTER TABLE:

mysql>SELECT CONCAT('RENAME TABLE ', GROUP_CONCAT( table_schema,'.',table_name, ' TO ','new_schema.',table_name,' '),';') as stmt FROM information_schema.TABLES WHERE table_schema LIKE 'oldSchema' GROUP BY table_schema\G
*************************** 1. row ***************************
stmt: RENAME TABLE oldSchema.tb10 TO new_schema.tb10 ,oldSchema.tb1 TO new_schema.tb1 ,oldSchema.tb9 TO new_schema.tb9 ,oldSchema.tb8 TO new_schema.tb8 ,oldSchema.tb7 TO new_schema.tb7 ,oldSchema.tb6 TO new_schema.tb6 ,oldSchema.tb5 TO new_schema.tb5 ,oldSchema.tb4 TO new_schema.tb4 ,oldSchema.tb3 TO new_schema.tb3 ,oldSchema.tb2 TO new_schema.tb2 ;
1 row in set (0.01 sec)

ATUALIZAÇÃO:
Se o comando acima mostrar um resultado pela metade (cortado), isso ocorre pois a função GROUP_CONCAT() limita o tamanho do resultado, para corrigir isto, basta digitar o comando abaixo:

SET SESSION group_concat_max_len = 4294967295;

Pronto, basta rodar o comando recebido como retorno da consulta e esta pronto, lembrando que antes de rodar o RENAME TABLE você precisa ter o novo banco de dados criado.

2. Utilizando mysqldump

mysqldump [OPCOES] --database oldSchema > oldSchema.sql
mysql new_schema < oldSchema.sql

Por hoje é só, espero que tenham gostado!

Gostou ? Ajude e Compartilhe!
Publicado em MySQL, mysqldump, Uncategorized | 7 Comentários