Arquivo da categoria: MySQL

Erro do MySQL no XAMPP: Error-Using unique option prefix ‘key_buffer’ is error-prone and can break in the future. Please use the full name ‘key_buffer_size’ instead

Ao tentar inicializar o MySQL server via painel de controle do XAMPP, o usuário recebe a mensagem de erro “Error-Using unique option prefix ‘key_buffer’ is error-prone and can break in the future. Please use the full name ‘key_buffer_size’ instead” 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())