Arquivo da tag: MySQL

Como criar um servidor web LEMP (Linux, NginX, MySQL, PHP) no Google Cloud (Google Compute Engine)

Este tutorial tem como o objetivo ensinar todos os passos para que o usuário possa criar seu servidor Web a um baixo custo na plataforma Google Cloud. Continue lendo

Erro ao importar backup do banco de dados no MySQL: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline

Ao tentar restaurar um backup no MySQL recebi a mensagem de erro:

ERROR 1118 (42000) at line 667: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.

Isto é um problema causado por um Bug do InnoDB que pode ser consertado da seguinte maneira:

Encontre seu arquivo de configuração do MySQL. Caso você não saiba onde se localiza (ele pode mudar de pasta de acordo com o sistema que você está utilizando), utilizeo o comando abaixo e localize o arquivo que tenha a seção [mysqld]:

sudo find / -name "*.cnf"

Depois de encontrar o arquivo de configuração do MySQL, abra-o:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Adicione as duas linhas abaixo à seção [mysqld] (Configurações Básicas do MySQL):

innodb_log_file_size = 256M
innodb_strict_mode = 0

Salve as modificações e reinicie o servidor MySQL:

sudo /etc/init.d/mysql restart

Apague os dados e estruturas já criadas na tentativa de restauração anterior do banco de dados; e realize uma nova tentativa de restaurar o banco de dados:

mysql -uUSUARIO -pSENHA NOMEDOBANCODEDADOS < ARQUIVO.sql

Como obter o próximo valor de um campo auto-incremental no mysql

Quem trabalha com o Oracle PL/SQL sabe que você pode obter isso através do NextVal() da seqüência, mas como fazer isso no MySQL?

Eu estava tentando gerar um código Hash para ser utilizado como uma referência externamente a um documento – para não exibir o ID interno usado na tabela -, mas não queria utilizar duas consultas (Um insert, e um select para obter o valor inserido).

Para resolver este problema em uma consulta apenas, criei uma função no banco de dados que me retornaria este valor:


CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50))
	RETURNS BIGINT
	LANGUAGE SQL
	NOT DETERMINISTIC
	CONTAINS SQL
	SQL SECURITY DEFINER
	COMMENT ''
BEGIN

DECLARE Value BIGINT;

SELECT
	AUTO_INCREMENT INTO Value
FROM
	information_schema.tables
WHERE
	table_name = TableName AND
	table_schema = DATABASE();

RETURN Value;

END

Para utilizar esta função, basta passar como parâmetro o nome da tabela que se deseja obter o valor do próximo ID (campo auto-incremental):

SELECT getAutoincrementalNextval ('document')

No meu código, para gerar o Hash para o documento, fiz da seguinte forma:

INSERT INTO
    document (Code, Title, Body)
VALUES ( 				
    sha1( concat (convert (now(), char), ' ', getAutoincrementalNextval ('document') ) ),
    'Title',
    'Body'
);

Este código hash foi apenas uma forma de não expor ao usuário o código interno de meu documento. Para gerar um código único eu crio uma pré-imagem SHA-1 baseada na junção da hora atual e o ID do registro.

Como saber onde o MySQL está armazenando os dados de seus bancos de dados?

Depois de uma atualização desastrosa no Ubuntu, o MySQL não consegue mais iniciar. Então, a única forma de resolver este problema é reinstalando o linux. Mas como salvar as informações armazenadas no banco de dados se não é possível inicializar o servidor MySQL para fazer o backup dos dados? Bem, as sugestões encontradas na Internet é para que seja feito o backup dos dados (copiando os arquivos datafiles) e depois sobrescrevessem os dados de uma nova instalação.

Mas onde estão os dados do MySQL?

A solução é simples:

Encontre o arquivo “my.cnf” (ou my.ini, se você estiver usando o Windows), utilizando o comando find do linux:

find / -name my.cnf

Em servidores que utilizam a configuração padrão, este arquivo se encontra na pasta “/etc/mysql/my.cnf”. Visualize o conteúdo deste arquivo, utilizando o comando cat:

cat /etc/mysql/my.cnf

Dentro do conteúdo deste arquivo, procure a variável “datadir”, o valor atribuído a ela é onde se localiza os dados armazenados (ex: /var/lib/mysql).

Pronto! Para copiar o arquivo é simples, modifique as permissões desta pasta inteira (recursivamente), compacte-a e mova para a pasta que você consiga acessar pelo cliente FTP (por exemplo, a pasta padrão do servidor web). Mude a permissão deste arquivo para conseguir copiar os dados pelo FTP.

chmod -R 777 /var/lib/mysql
tar -zcvf /var/lib/mysqldata.tar.gz /var/lib/mysql
mv /var/lib/mysqldata.tar.gz /var/www
chmod 777 /var/www/mysqldata.tar.gz

Agora, caso deseje restaurar o banco de dados é só seguir os seguintes passos:

  • Instale um novo servidor MySQL e teste para saber se ele está inicializando
  • Crie no novo servidor o banco de dados desejado (ele deve ter o nome exato do banco de dados antigo
  • Pare o servidor do MySQL
  • Sobrescreva a pasta que o MySQL criou para este banco utilizando a pasta contida dentro do arquivo de backup.
  • Inicialize o novo servidor MySQL
  • Banco de dados restaurado!

Como obter registros aleatórios no MySQL

Conseguir obter um registro aleatório pode até não ser um dos recursos mais importantes de um banco de dados, mas não deixa de ser muito útil, principalmente se você precisa:

  • Exibir itens sem mostrar favoritismo;
  • Testar o código retornando valores diferentes;
  • Exibir itens de forma não-específica;

Porém, apesar da grande utilidade, este é um recurso muito fácil de ser utilizado. Para isso basta utilizar o comando Rand() na cláusula ORDER BY:

 SELECT artigo_id, titulo, descricao FROM artigo ORDER BY RAND() LIMIT 4 

O código acima retornará a informação artigo_id, titulo, descricao (SELECT artigo_id, titulo, descricao) de quatro artigos (LIMIT 4) que estão contidos na tabela artigo (FROM artigo) selecionados de forma aleatória (ORDER BY RAND())

Comando num_rows do MySQLi (prepared statement) retorna apenas o valor 0

Continuando os meus trabalhos de conversão de um código que utilizava a conexão MySQl para a conexão MySQLi encontrei um novo problema: o comando num_rows sempre retornava o valor 0, mesmo nas consultas em que eu sabia que traziam mais resultados:

$lobj_mysqliQuery = $pobj_DBObject->stmt_init();
$lobj_mysqliQuery->prepare("SELECT id FROM usuario WHERE nome like ?");
$lobj_mysqliQuery->bind_param("s", $plstr_usuarioNome);
$lobj_mysqliQuery->execute();

$llng_usuarioQuantidade = $lobj_mysqliQuery->num_rows;

Bem, onde estava o erro? Aparentemente (novamente) estava tudo correto. Porém, o MySQLi tem uma forma diferente de ver a vida…:)

O erro estava na ausência da utilização do comando store_result(). Que, segundo o manual do PHP, serve para transferir o resultado da última consulta (Resultset) para a variável desejada. Assim, como não havíamos executado este comando, era como se estivéssemos tentando pegar o número de linhas de um ResultSet vazio.

o código final ficou assim, e funcionou:

$lobj_mysqliQuery = $pobj_DBObject->stmt_init();
$lobj_mysqliQuery->prepare("SELECT id FROM usuario WHERE nome like ?");
$lobj_mysqliQuery->bind_param("s", $plstr_usuarioNome);
$lobj_mysqliQuery->execute();
$lobj_mysqliQuery->store_result();

$llng_usuarioQuantidade = $lobj_mysqliQuery->num_rows;

* Observação: Nestes exemplos estão ocultos os comandos responsáveis por abrir e fechar a conexão com o banco de dados.

Warning: mysqli_connect() [function.mysqli-connect]: (HY000/2005): Unknown MySQL server host ‘localhost:3306’ (11004)

Ao tentar migrar um sistema PHP das conexões MySQL para MySQLi, me deparei com o seguinte problema:

Warning: mysqli_connect() [function.mysqli-connect]: (HY000/2005): Unknown MySQL server host ‘localhost:3306’ (11004)

Aparentemente não havia erro:

$lobj_Database = mysqli_connect(SETTINGS_SGBD_HOST.":".SETTINGS_SGBD_PORT, SETTINGS_SGBD_USER, SETTINGS_SGBD_PASSWORD, SETTINGS_SGBD_DATABASE);

Aparentemente, pois não me lembrei que a sintaxe do MySQLi é um pouco diferente. O endereço da porta passa a ser o último parâmetro da conexão. Ficando assim:

$lobj_Database = mysqli_connect(SETTINGS_SGBD_HOST, SETTINGS_SGBD_USER, SETTINGS_SGBD_PASSWORD, SETTINGS_SGBD_DATABASE, SETTINGS_SGBD_PORT);

Importante lembrar que este é um método de conexão estilo procedural, e que o MySQLi suporta o estilo orientado a objeto também.

Como reinicializar o MySQL no Linux Ubuntu

Depois de editar qualquer arquivo de configuração do MySQL não conseguimos observar as modificações funcionando pois é necessário que o mesmo seja reinicializado para que as novas configurações entrem em vigor. Para fazer isso, no Ubuntu, digite na linha de comando:

/etc/init.d/mysql start
/etc/init.d/mysql stop

Ou somente:

/etc/init.d/mysql restart

Se os comandos não funcionarem, tente navegar através dos diretório e então reinicie o servidor:

cd 
cd /etc/init.d
mysql restart