Não é possível conceder privilégios do MySQL ao usuário de manutenção do sistema Debian

1

Eu tenho um servidor Debian 7 dedicado que executa vários sites com o MySQL como servidor de banco de dados. Quando tentei instalar as atualizações mais recentes, o MySQL não pôde ser atualizado porque o servidor não conseguiu parar.

Encontrei alguém com sintomas semelhantes nesta pergunta: link

As respostas à pergunta acima sugerem a concessão de privilégios totais em todos os bancos de dados para 'debian-sys-maint'@'localhost' , mas quando tento conceder os privilégios, recebo um erro de acesso negado.

mysql> GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY '...';
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost';
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

Outra coisa estranha é que agora tenho dois usuários root na minha tabela mysql.user . Isso é normal ou isso pode estar relacionado ao meu problema? O localhost.localdomain nem sequer tem um hash de senha. Eu também tenho um usuário para cada site que eu gero, mas os deixei de fora para maior clareza.

+-----------------------+------------------+
| Host                  | User             |
+-----------------------+------------------+
| localhost             | debian-sys-maint |
| localhost             | root             |
| localhost.localdomain | root             |
+-----------------------+------------------+

Editar: Executar dpkg-reconfigure mysql-server diz isto:

xxx@yyy:~$ sudo dpkg-reconfigure mysql-server
/usr/sbin/dpkg-reconfigure: mysql-server is broken or not fully installed

A pesquisa por esse erro levou-me a uma publicação no fórum , sugerindo que pode haver pacotes mais antigos atrapalhando as coisas, mas para mim, parece que não é o caso aqui:

xxx@yyy:~$ sudo dpkg --get-selections | grep mysql
dovecot-mysql                                   install
libdbd-mysql-perl                               install
libmysqlclient18:amd64                          install
mysql-client-5.5                                install
mysql-common                                    install
mysql-server                                    install
mysql-server-5.5                                install
mysql-server-core-5.5                           install
php5-mysql                                      install
    
por Kaivosukeltaja 06.02.2015 / 15:50

1 resposta

1

Eu tenho três (3) posts no StackExchange que explicam rapidamente a causa raiz

CAUSA RADICA

  • Você tem 37 colunas em mysql.user . Tudo bem para o MySQL 5.0
  • Você está executando o MySQL 5.5. Você deveria ter 42 colunas.

SUGESTÃO

Você terá que executar o comando do MySQL

# mysql_upgrade --upgrade-system-tables

Tenha em mente que você está pulando duas versões do MySQL. Faça o backup da tabela mysql.user antes de fazer isso

ATUALIZAÇÃO 2015-02-10 10:59 EST

Com base no seu comentário , Eu posso apenas sugerir uma coisa: Consulte o meu post Qualquer problema conhecido que esteja sendo atualizado do MySQL 5.1.73 para 5.6.21? na seção "PROBLEMA # 1: Caminho de atualização" sobre como atualizar duas versões do MySQL.

ATUALIZAÇÃO 2015-02-11 12:26 EST

Aqui está sua situação

  • Você tem um mysql.user compatível com o MySQL 5.0
  • Você precisa obter o mysql.user atualizado para trabalhar com o MySQL 5.5

Eu tenho uma ideia maluca: adicionar as 5 colunas ausentes à mão

No meu post DBA StackExchange Não é possível conceder privilégios como root , Eu exibo todas as colunas na tabela mysql.user do MySQL 5.6, 5.5, 5.1, 5.0 e 4.x.

A partir dessas exibições, faremos o seguinte:

  • Faça um backup do mysql.user antes como mysql.user_backup
  • Construa mysql.user para ter as mesmas colunas que o MySQL 5.5, adicionando as cinco (5) colunas faltantes.
  • Verifique se as colunas estão na mesma ordem
  • Preencha os privs ausentes para usuários raiz com Y
  • Implantar novos privs

Etapas para reparar mysql.user

CREATE TABLE mysql.user_backup LIKE mysql.user;
INSERT INTO mysql.user_backup SELECT * FROM mysql.user;
ALTER TABLE mysql.user
    ADD Event_priv enum('N','Y') DEFAULT 'N' AFTER Create_user_priv;
ALTER TABLE mysql.user
    ADD Trigger_priv enum('N','Y') DEFAULT 'N' AFTER Event_priv;
ALTER TABLE mysql.user
    ADD Create_tablespace_priv enum('N','Y') DEFAULT 'N' AFTER Trigger_priv;
ALTER TABLE mysql.user
   ADD plugin CHAR(64) DEFAULT NULL AFTER max_user_connections;
ALTER TABLE mysql.user
    ADD authentication_string text DEFAULT 'N' AFTER plugin;
UPDATE mysql.user SET
    Event_priv='Y',
    Trigger_priv='Y',
    Create_tablespace_priv ='Y'
WHERE user='root' and host='localhost';
FLUSH PRIVILEGES;

Se você quiser reverter isso, você pode fazer isso

RENAME TABLE mysql.user TO mysql.user_old,mysql.user_backup TO mysql.user;
FLUSH PRIVILEGES;

DÊ UMA EXPERIÊNCIA !!!

    
por 09.02.2015 / 17:51