Acho esse erro particularmente perturbador porque o MySQL introduziu o INFORMATION_SCHEMA com a introdução do MySQL 5.0. A resposta de @gbn mostra que esse bug
volta para o MySQL 5.0.16
foi relatado em QUALQUER operação com este
foi baseado no erro ocorrido no sistema operacional IBM AIX 5.3 ML2
foi fechado 2006-01-26
A definição de banco de dados do MySQL é simplesmente uma subpasta em datadir.
Agora, aqui está o motivo pelo qual considero o erro particularmente perturbador: O banco de dados INFORMATION_SCHEMA não deve ser uma pasta manifestada em datadir.
Por exemplo
datadir é /var/lib/mysql
Você tem dois bancos de dados: db1 e db2
Vá para o sistema operacional e execute o seguinte:
cd /var/lib/mysql
ls -l
Você verá várias pastas:
mysql
db1
db2
teste (já que o padrão do MySQL instala um banco de dados de teste)
. (diretório atual)
.. (diretório pai)
No mysql, quando você faz SHOW DATABASES;, você não deve ver .e ... O código-fonte teria garantido isso. Agora, onde está o INFORMATION_SCHEMA? Adivinha? Todas as tabelas em INFORMATION_SCHEMA são tabelas temporárias e usam o mecanismo de armazenamento de memória. Observe também que você não vê uma pasta chamada INFORMATION_SCHEMA. Agora, confira a definição de INFORMATON_SCHEMA.TABLES:
Eu coloco toda a culpa por este erro no código-fonte porque, assim como o mysql ignora .e ..como pastas de casos especiais que não devem ser consideradas bancos de dados, o INFORMATION_SCHEMA também deve ser considerado uma pasta de casos especiais, uma pasta de casos especiais que não possui um arquivo manifesto no datadir.
Eu recomendo apenas atualizar o MySQL para a versão mais recente porque, como @gbn descobriu, houve um relatório de bug, mas está marcado como fechado. Isso só poderia acontecer
se você ainda estiver executando uma versão muito antiga do mysql
esta situação não foi tratada adequadamente no código-fonte do sistema operacional Ubuntu
@gbn recebe +1 de mim por encontrar o relatório de bug que me ajudou a olhar um pouco mais fundo
No MySQL Versão 5.5, o NFORMATION_SCHEMAdiretório/pasta existe; Eu estou assumindo que isso acontece em outras versões. Não é controlado na configuração de my.iniou my.cnfcomo datadir=whatever; ele parece estar predefinido no caminho de instalação do MySQL e é lido quando o MySQL é carregado pela primeira vez na inicialização.
Não há my.iniou my.cnfconfiguração para colocar a localização deste esquema. Isso parece se aplicar às versões Unix/Linux e Windows do MySQL 5.5 e pode remontar a quando esse esquema foi introduzido pela primeira vez. Eu fui de 4.1 para 5.5 nas caixas Windows e Unix, então não sei sobre as versões intermediárias.
Esqueci de mencionar que a pasta no meu caso não é o nome do esquema, mas apenas outra pasta chamada simplesmente MySQLcom o seguinte arquivo de catálogo/XML nomeado information_schema.mbpcontendo os dados abaixo, como você pode ver em seu cliente MySQL Admin. Eu acho que esta é a cópia que carrega na memória na inicialização. Vejo que minha versão parece ser mais longa que a sua e a minha também tem uma seção de configuração do usuário.
Se você não fizer backup disso com o regular datadirou sqldumpem meus sistemas, perderá a configuração e as permissões do usuário. Existem outros arquivos semelhantes contendo os dados reais das tabelas. Acho que a .mbpextensão é usada para indicar um backup ou cópia do mecanismo de memória. Eu sabia que tinha que estar armazenado em algum lugar e tinha que haver uma maneira de acessá-lo.
Eu importei minhas configurações e permissões de usuário antigas quando atualizei para 5.5. Eles foram enviados para este banco de dados pelo servidor. No entanto, não foi salvo como no passado. Portanto, se e quando você estiver usando minha versão, precisará fazer backup deste arquivo ou perderá todos os seus usuários e permissões. Acho que é para isso que serve esse banco de dados embutido no meu caso.
Desculpe, isso é tão grande! Eu queria mostrar a você como era e como encontrá-lo pelo nome. hmm eu não tentei, no entanto, eu me pergunto se você criou outro arquivo de dados como este em seu local atual e mesma extensão de arquivo se ele o carregasse na inicialização? Isto é, se você realmente deseja criar um banco de dados dessa maneira.
Encontrei o problema ao criar tabelas temporárias para um procedimento armazenado. Eu queria usar a exibição information_schema.tables para pesquisar minha tabela temporária para determinar se eu tentaria criar uma instrução de tabela temporária ou excluí-la da própria tabela temporária. No entanto, a visualização information_schema.tables nunca mostrou que existia, então meu código escrito como abaixo não funcionaria corretamente:
declare v_table_exists int;
select count(*) from information_schema.tables where table_name = 'MY_TEMP_TABLE';
if v_table_exists = 0 then
create temporary table MY_TEMP_TABLE(...);
else
delete from MY_TEMP_TABLE; // sets up for the next iteration within the same session
end if;
Eu descobri uma solução alternativa que é satisfatória. Eu reescrevi o código acima como o seguinte:
create temporary table if not exists MY_TEMP_TABLE(...);
delete from MY_TEMP_TABLE;
Descobri que esta solução me forneceu o armazenamento temporário em uma sessão enquanto trabalhava adequadamente.
Acho esse erro particularmente perturbador porque o MySQL introduziu o INFORMATION_SCHEMA com a introdução do MySQL 5.0. A resposta de @gbn mostra que esse bug
A definição de banco de dados do MySQL é simplesmente uma subpasta em datadir.
Agora, aqui está o motivo pelo qual considero o erro particularmente perturbador: O banco de dados INFORMATION_SCHEMA não deve ser uma pasta manifestada em datadir.
Por exemplo
Vá para o sistema operacional e execute o seguinte:
Você verá várias pastas:
No mysql, quando você faz
SHOW DATABASES;
, você não deve ver.
e..
. O código-fonte teria garantido isso. Agora, onde está o INFORMATION_SCHEMA? Adivinha? Todas as tabelas em INFORMATION_SCHEMA são tabelas temporárias e usam o mecanismo de armazenamento de memória. Observe também que você não vê uma pasta chamada INFORMATION_SCHEMA. Agora, confira a definição de INFORMATON_SCHEMA.TABLES:Eu coloco toda a culpa por este erro no código-fonte porque, assim como o mysql ignora
.
e..
como pastas de casos especiais que não devem ser consideradas bancos de dados, o INFORMATION_SCHEMA também deve ser considerado uma pasta de casos especiais, uma pasta de casos especiais que não possui um arquivo manifesto no datadir.Eu recomendo apenas atualizar o MySQL para a versão mais recente porque, como @gbn descobriu, houve um relatório de bug, mas está marcado como fechado. Isso só poderia acontecer
@gbn recebe +1 de mim por encontrar o relatório de bug que me ajudou a olhar um pouco mais fundo
Erro de permissões, relatado como um (antigo) bug do MySQL
Confira o bit de permissões nos documentos de instalação do MySQL
No MySQL Versão 5.5, o
NFORMATION_SCHEMA
diretório/pasta existe; Eu estou assumindo que isso acontece em outras versões. Não é controlado na configuração demy.ini
oumy.cnf
comodatadir=whatever
; ele parece estar predefinido no caminho de instalação do MySQL e é lido quando o MySQL é carregado pela primeira vez na inicialização.Não há
my.ini
oumy.cnf
configuração para colocar a localização deste esquema. Isso parece se aplicar às versões Unix/Linux e Windows do MySQL 5.5 e pode remontar a quando esse esquema foi introduzido pela primeira vez. Eu fui de 4.1 para 5.5 nas caixas Windows e Unix, então não sei sobre as versões intermediárias.Esqueci de mencionar que a pasta no meu caso não é o nome do esquema, mas apenas outra pasta chamada simplesmente
MySQL
com o seguinte arquivo de catálogo/XML nomeadoinformation_schema.mbp
contendo os dados abaixo, como você pode ver em seu cliente MySQL Admin. Eu acho que esta é a cópia que carrega na memória na inicialização. Vejo que minha versão parece ser mais longa que a sua e a minha também tem uma seção de configuração do usuário.Se você não fizer backup disso com o regular
datadir
ousqldump
em meus sistemas, perderá a configuração e as permissões do usuário. Existem outros arquivos semelhantes contendo os dados reais das tabelas. Acho que a.mbp
extensão é usada para indicar um backup ou cópia do mecanismo de memória. Eu sabia que tinha que estar armazenado em algum lugar e tinha que haver uma maneira de acessá-lo.Eu importei minhas configurações e permissões de usuário antigas quando atualizei para 5.5. Eles foram enviados para este banco de dados pelo servidor. No entanto, não foi salvo como no passado. Portanto, se e quando você estiver usando minha versão, precisará fazer backup deste arquivo ou perderá todos os seus usuários e permissões. Acho que é para isso que serve esse banco de dados embutido no meu caso.
Desculpe, isso é tão grande! Eu queria mostrar a você como era e como encontrá-lo pelo nome. hmm eu não tentei, no entanto, eu me pergunto se você criou outro arquivo de dados como este em seu local atual e mesma extensão de arquivo se ele o carregasse na inicialização? Isto é, se você realmente deseja criar um banco de dados dessa maneira.
Encontrei o problema ao criar tabelas temporárias para um procedimento armazenado. Eu queria usar a exibição information_schema.tables para pesquisar minha tabela temporária para determinar se eu tentaria criar uma instrução de tabela temporária ou excluí-la da própria tabela temporária. No entanto, a visualização information_schema.tables nunca mostrou que existia, então meu código escrito como abaixo não funcionaria corretamente:
Eu descobri uma solução alternativa que é satisfatória. Eu reescrevi o código acima como o seguinte:
Descobri que esta solução me forneceu o armazenamento temporário em uma sessão enquanto trabalhava adequadamente.