terça-feira, 23 de setembro de 2014

MySQL conexões de usuários

Original post: http://anothermysqldba.blogspot.com/2014/09/mysql-user-connections.html

Então eu me encontrei explicando as diferenças com os usuários do MySQL e como eles autenticar. Em primeiro lugar esta informação não é nova, mas pode ser encontrada aqui:
Vou apenas mostrar alguns exemplos do mundo real para explicar isso.

O MySQL utiliza o nome de usuário, bem como o acesso quando se avalia as permissões de um usuário. É por isso que a melhor prática é remover os usuários anônimos.

Para este exemplo vou começar com os seguintes usuários



MariaDB [(none)]> select user , host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| | centos64 |
| root | centos64 |
| | localhost |
| root | localhost |
+---------+-----------+

Eu posso entrar no servidor até pensei que não tem um nome de usuário porque o padrão para baixo para anonymous @ localhost.


# mysql -u nobody
MariaDB [(nenhum)]> selecione current_user ();
+ ---------------- +
| Current_user () |
+ ---------------- +
|localhost |
+ ---------------- +
MariaDB [(nenhum)]> show subvenções;
+ -------------------------------------- +
| Bolsas paralocalhost |
+ -------------------------------------- +
| GRANT Uso na * TO '' @ 'localhost'. |
+ -------------------------------------- +

Enquanto eu não posso fazer muita coisa que eu ainda tenho no banco de dados.

Agora, quando eu passar por um usuário conhecido:


# mysql -u root -p
MariaDB [(nenhum)]> selecione current_user;
+ ---------------- +
| Current_user |
+ ---------------- +
| Root @ localhost |
+ ---------------- +
MariaDB [(nenhum)]> show subvenções;
+----------------------------------------------------------------------------------------------------------------------------------------+
| Bolsas para root @ localhost |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL ON * PRIVILÉGIOS * TO 'root' @ 'localhost' IDENTIFICADAS POR SENHA '* 8CD56861FDADF7A264741F27D502D1A8DAE0A8F7' WITH GRANT OPTION. |
| GRANT PROXY ON '' @ '' para 'root' @ 'localhost' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------+


Atualmente, o usuário root tem quatro contas diferentes.

MariaDB [(none)]> select user , host from mysql.user where user = 'root';
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| root | centos64 |
| root | localhost |
+------+-----------+

Estas são todas as contas diferentes. Eu só preciso de um deles embora. Eu só uso a conta root através de ligações locais de acolhimento.

MariaDB [(none)]> DROP USER 'root'@'127.0.0.1';
Query OK, 0 rows affected (0.33 sec)

MariaDB [(none)]> DROP USER 'root'@'centos64';
Query OK, 0 rows affected (0.02 sec)

MariaDB [(none)]> DROP USER 'root'@'::1';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> select user , host from mysql.user where user = 'root';
+------+-----------+
| user | host |
+------+-----------+
| root | localhost |
+------+-----------+

Então, o que eu quero dizer com quatro contas diferentes? Eles toda a conta de usuário root. Sem .. Eles são raiz e tudo o host. Assim, cada conta (usuário + host) pode ter permissões diferentes.

Então, vamos fazer um exemplo próximo para mostrar a diferença.
Assim, o servidor, neste exemplo, possui duas interfaces de rede. Então, eu vou criar um usuário por todos os pontos de acesso, cada um com diferentes permissões para mostrar as diferenças. Vou ajustar a mesma senha, mas aqueles poderia ser diferente também.

MariaDB [(none)]> GRANT SELECT ON *.* TO 'anothermysqldba'@'10.0.2.15' IDENTIFIED BY '<cleartext password>';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE , DROP, RELOAD, SHUTDOWN, PROCESS, FILE, INDEX, ALTER ON *.* TO 'anothermysqldba'@'192.168.0.%' IDENTIFIED BY '<cleartext password>';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'anothermysqldba'@'localhost' IDENTIFIED BY '<cleartext password>' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(nenhum)]> selecione usuário, host de mysql.user onde user = 'anothermysqldba';
+ ----------------- + ------------- +
| Usuário | anfitrião |
+ ----------------- + ------------- +
| Anothermysqldba | 10.0.2.15 |
| Anothermysqldba |. 192.168.0% |
| Anothermysqldba | localhost |
+ ----------------- + ------------- +

Então o que isso significa? Mesmo que os nomes de usuário são os mesmos, porque o MySQL usa o acolhimento, bem como para validar um usuário a cada ponto de acesso do usuário, como permissões diferentes.

Enquanto você pode confiar em alguns de seus desenvolvedores, este é muitas vezes uma boa idéia para limitar alguns dos seu acesso se eles estão trabalhando remotamente ou através de seus scripts. Se eles precisam fazer algo que não envolve você e eles têm de ssh para o servidor em si e login para realizar outras tarefas. Este é, naturalmente, dependente da relação de trabalho e fluxo de sua empresa e / ou aplicações.

Usando o 10.0.2.15 anfitrião o usuário só tem acesso select.

# mysql -h 10.0.2.15 -u anothermysqldba -p
MariaDB [(nenhum)]> selecione current_user ();
+ --------------------------- +
| Current_user () |
+ --------------------------- +
| Anothermysqldba@10.0.2.15 |
+ --------------------------- +
MariaDB [(nenhum)]> show subvenções;
+-------------------------------------------------------------------------------------------------------------------------+
| Bolsas para anothermysqldba@10.0.2.15 |
+-------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECIONE ON * TO 'anothermysqldba'@'10.0.2.15 »identificados através de senha' * 31360D7EE84BE965C0E759179FC61B6943BCA64F '. |
+-------------------------------------------------------------------------------------------------------------------------+

Usando o host 192.168.0.26 o usuário tem mais acesso. Essa conta também é definido para acessar através de qualquer coisa sob o 192.168.0 / 255 (%) de sub-rede.

# mysql -h 192.168.0.26 -u anothermysqldba -p
MariaDB [(nenhum)]> selecione current_user ();
+ + -----------------------------
| Current_user () |
+ + -----------------------------
| Anothermysqldba@192.168.0.% |
+ + -----------------------------
MariaDB [(nenhum)]> show subvenções;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Bolsas para anothermysqldba@192.168.0.% |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, processo e arquivo, INDEX, ALTER ON * TO 'anothermysqldba'@'192.168.0.% »identificados através de senha' * 31360D7EE84BE965C0E759179FC61B6943BCA64F '. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Então, como você vai assumir o usuário localhost tem a conta de acesso completo.

# mysql -u anothermysqldba -p
MariaDB [(nenhum)]> selecione current_user ();
+ --------------------------- +
| Current_user () |
+ --------------------------- +
| Anothermysqldba @ localhost |
+ --------------------------- +
1 row in set (0.00 sec)

MariaDB [(nenhum)]> show subvenções;
+---------------------------------------------------------------------------------------------------------------------------------------------------+
| Bolsas para anothermysqldba @ localhost |
+---------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL ON * PRIVILÉGIOS * TO 'anothermysqldba' @ 'localhost' IDENTIFICADAS POR SENHA '* 31360D7EE84BE965C0E759179FC61B6943BCA64F' WITH GRANT OPTION. |
+---------------------------------------------------------------------------------------------------------------------------------------------------+

Agora, como eu disse antes, é melhor prática para remover os usuários anônimos. Usando o mysql_secure_installation para instalação vai ajudar com a sua também.

Por que isso importa?

# mysql -u anothremysqldba -p
MariaDB [(nenhum)]> selecione current_user ();
+ ---------------- +
| Current_user () |
+ ---------------- +
|localhost |
+ ---------------- +
1 row in set (0.00

O exemplo simples ... está acima e apenas evitar erros simples. Um erro de digitação permitido o acesso ao banco de dados, não deve permitir isso.

Então, retire em seguida e testar novamente.

MariaDB [(none)]> DROP USER ''@'localhost';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> DROP USER ''@'centos64';
Query OK, 0 rows affected (0.00 sec)

# Mysql-u anothremysqldba -p
Digite a senha:
ERROR 1045 (28000): Acesso negado para o usuário 'anothremysqldba' @ 'localhost' (senha usada: SIM

Então, o que significa se o seu banco de dados é criado com a maioria com% como o nome ou ip estrita endereços e não curingas?

Esta seria uma decisão de segurança e de negócios de sua parte. Pessoalmente não é uma opção válida na minha opinião. Nada mais que um curinga (%) permite que um ponto de acesso robusto, mas se o firewall tem uma falha que também abre o acesso ao controle remoto de usuários da rede. Um endereço IP estrita por usuário também é bastante rigorosa na minha opinião, mas isso depende do usuário. Por exemplo, mesmo com uma conta que tenha sido criada para replicação Prefiro ainda usar o endereço IP com uma ie%.: 192.168.0%. Endereços IP mudam (mesmo mudanças estáticos para usuários remotos do DBA muitas vezes não é dito) e que muitas vezes resulta em pessoas que vêm para o DBA com queixas sobre falhas de acesso.

Certa vez trabalhei com uma pessoa que limitava a cada acesso do usuário bloqueado para um endereço IP estático. Essa pessoa teve que alterar constantemente declarações de concessão. As pessoas têm de ser capazes de trabalhar de forma fácil e eficaz, enquanto você pode garantir a segurança em sua extremidade.


quarta-feira, 13 de agosto de 2014

MySQL Foreign Chaves Exemplo & ERROR 1452

Original post - http://anothermysqldba.blogspot.com/2014/08/mysql-foreign-keys-example-error-1452.html

 Então, eu encontrei uma situação hoje lidar com a necessidade de atualizar um campo, mas o usuário não foi capaz de fazê-lo por causa das restrições de chave estrangeira relacionados. 

Este blog com ser um exemplo simples que mostra uma chave estrangeira e como atualizá-los se você tiver que fazê-lo. 

Primeiro vamos criar uma tabela simples e preenchê-lo com dados aleatórios. 

CREATE TABLE `table_w_code` ( 
`SOMECode` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 
`NameofCode` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 
PRIMARY KEY (`SOMECode`) 
) ENGINE=InnoDB ; 


Agora vamos precisar de outra tabela que tem uma chave estrangeira ligada à nossa tabela anterior. 

[anothermysqldba]> CREATE TABLE `table_with_fk` ( 
`SOMEID` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 
`SOMECode` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 
`Somemorefields` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL, 
PRIMARY KEY (`SOMEID`,`SOMECode`), 
KEY `FK_Patient_Facility` (`SOMECode`), 
CONSTRAINT `FK_CODE` FOREIGN KEY (`SOMECode`) REFERENCES `table_w_code` (`SOMECode`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB; 


Por isso, vamos preencher alguns dados aleatórios nas tabelas para que possamos tentar e atualizá-los mais tarde. 
post anterior sobre números aleatórios, se necessário é aqui 

[anothermysqldba]> SET @A = 3; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> SET @B = 15 - @A; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> SET @C = 16; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> SET @D = 25 - @C; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> INSERT INTO table_w_code VALUES 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'ABC' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'DEF' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'GHI' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'JKL' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'MNO' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'PQR' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'STU' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'VWX' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'YZ' ) ; 
Query OK, 9 rows affected (0.05 sec) 
Records: 9 Duplicates: 0 Warnings: 0 

[anothermysqldba]> SELECT * from table_w_code ORDER BY NameofCode; 
+--------------------------+------------+ 
| SOMECode | NameofCode | 
+--------------------------+------------+ 
| 204e9800998ecf8427e | ABC | 
| f00b204e9800998e | DEF | 
| 98f00b204e9800998ecf8427 | GHI | 
| 98f00b204e9800998e | JKL | 
| 1d8cd98f00b204e9800 | MNO | 
| 1d8cd98f00b204e9800998ec | PQR | 
| 0b204e9800998ecf8427e | STU | 
| cd98f00b204e9800998ec | VWX | 
| d98f00b204e9800998ecf842 | YZ | 
+--------------------------+------------+ 
9 rows in set (0.00 sec) 

[anothermysqldba]> SET @D = 2; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> SET @E = 25 - @D; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> INSERT INTO table_with_fk SELECT SUBSTR(md5(''),FLOOR( @D + (RAND() * @E ))), SOMECode , NameofCode FROM table_w_code; 
Query OK, 9 rows affected (0.08 sec) 
Records: 9 Duplicates: 0 Warnings: 0 

[anothermysqldba]> select * from table_with_fk ORDER BY Somemorefields; 
+---------------------------------+--------------------------+----------------+ 
| SOMEID | SOMECode | Somemorefields | 
+---------------------------------+--------------------------+----------------+ 
| 41d8cd98f00b204e9800998ecf8427e | 204e9800998ecf8427e | ABC | 
| e9800998ecf8427e | f00b204e9800998e | DEF | 
| 98ecf8427e | 98f00b204e9800998ecf8427 | GHI | 
| 00b204e9800998ecf8427e | 98f00b204e9800998e | JKL | 
| 04e9800998ecf8427e | 1d8cd98f00b204e9800 | MNO | 
| 04e9800998ecf8427e | 1d8cd98f00b204e9800998ec | PQR | 
| b204e9800998ecf8427e | 0b204e9800998ecf8427e | STU | 
| b204e9800998ecf8427e | cd98f00b204e9800998ec | VWX | 
| 4e9800998ecf8427e | d98f00b204e9800998ecf842 | YZ | 
+---------------------------------+--------------------------+----------------+ 


OK, que é um círculo sobre a maneira de gerar alguns dados aleatórios para este exemplo. 

Então o que acontece se precisávamos para atualizar dados relacionados com o valor ABC em table_with_fk? 

[anothermysqldba]> SELECT SOMEID , SOMECode , Somemorefields FROM table_with_fk WHERE Somemorefields = 'ABC'; 
+---------------------------------+---------------------+----------------+ 
| SOMEID | SOMECode | Somemorefields | 
+---------------------------------+---------------------+----------------+ 
| 41d8cd98f00b204e9800998ecf8427e | 204e9800998ecf8427e | ABC | 
+---------------------------------+---------------------+----------------+ 

[anothermysqldba]> SELECT SOMECode , NameofCode FROM table_w_code WHERE NameofCode = 'ABC'; 
+---------------------+------------+ 
| SOMECode | NameofCode | 
+---------------------+------------+ 
| 204e9800998ecf8427e | ABC | 
+---------------------+------------+ 

[anothermysqldba]> 
UPDATE table_with_fk SET SOMEID = 'I UPDATED THIS' , SOMECode = 'I UPDATED THIS' WHERE SOMECode = '204e9800998ecf8427e'; 
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails(`anothermysqldba`.`table_with_fk`, CONSTRAINT `FK_CODE` FOREIGN KEY (`SOMECode`) REFERENCES `table_w_code` (`SOMECode`) ON DELETE NO ACTION ON UPDATE NO ACTION) 


Por isso, foi bloqueado como deveria ter sido. Nós depois de tudo ter "ON DELETE NO ACTION ON UPDATE NO ACTION" na definição da tabela. 

Nem tudo está perdido, porém. A simples edição da variável "FOREIGN_KEY_CHECKS" permitirá que a declaração de atualização para executar. No entanto, é mais seguro para executar isso, na minha opinião, dentro de uma transação. 


[anothermysqldba]> START TRANSACTION; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> SET FOREIGN_KEY_CHECKS=0; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> UPDATE table_with_fk SET SOMEID = 'I UPDATED THIS' , SOMECode = 'I UPDATED THIS' WHERE SOMECode = '204e9800998ecf8427e'; 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 

[anothermysqldba]> SET FOREIGN_KEY_CHECKS=1; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> COMMIT; 
Query OK, 0 rows affected (0.07 sec) 


Agora, a pergunta geral é por que você iria querer quebrar seus valores de chave estrangeira que tinha fixado no local por uma razão? É inteiramente até você. 

Hoje aconteceu que de alguma forma um valor havia sido inserido com espaço em branco extra no valor no banco de dados. Então eu fiz uma transação semelhante para atualizar e remover o espaço em branco. 

No geral ... isto é só para mostrar que pode ser feito.

sexta-feira, 18 de julho de 2014

Erro MySQL secure_auth

Original post: http://anothermysqldba.blogspot.com/2014/07/mysql-secureauth-error.html

Eu abordou os erros secure_auth antes, quando ele bloqueia a replicação neste post do blog . 

No entanto, eu percebi que eu iria fazer neste blog postar uma correção mais geral ao conectar via clientes MySQL. Isto é para os servidores antes do MySQL 5.6. 

Portanto, se você receber um erro secure_auth quando a conexão ao MySQL os seguintes passos devem resolver este erro. 

+---------------+-------------------------------------------+ 
| User | Password | 
+---------------+-------------------------------------------+ 
| authdtestuser | 34d22ac342c35af2
 +---------------+-------------------------------------------+ 
| User | Password | 
+---------------+-------------------------------------------+ 
| authdtestuser | 34d22ac342c35af2 | |+---------------+-------------------------------------------+ 

SELECT @@session.old_passwords, @@global.old_passwords; +-------------------------+------------------------+ 
| @@session.old_passwords | @@global.old_passwords | 
+-------------------------+------------------------+ 
| 1 | 1 | 
+-------------------------+------------------------+ 

mysql> SET @@session.old_passwords = 0; SET @@global.old_passwords=0; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT @@session.old_passwords, @@global.old_passwords; 
+-------------------------+------------------------+ 
| @@session.old_passwords | @@global.old_passwords | 
+-------------------------+------------------------+ 
| 0 | 0 | 
+-------------------------+------------------------+ 
1 row in set (0.00 sec) 

mysql> SET PASSWORD FOR 'authdtestuser'@'localhost' = PASSWORD('sshthisisasecret'); 
Query OK, 0 rows affected (0.00 sec) 

mysql> select User , Password from mysql.user where User = 'authdtestuser'; 
+---------------+-------------------------------------------+ 
| User | Password | 
+---------------+-------------------------------------------+ 
| authdtestuser | *E48BD8BF1B9F29459E5284AD158443B5B33B70E4 | 
+---------------+-------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SET @@session.old_passwords = 1; SET @@global.old_passwords=1; 

mysql> SELECT @@session.old_passwords, @@global.old_passwords; 
+-------------------------+------------------------+ 
| @@session.old_passwords | @@global.old_passwords | 
+-------------------------+------------------------+ 
| 1 | 1 | 
+-------------------------+------------------------+ 
1 row in set (0.00 sec) 
| |+---------------+-------------------------------------------+ 

SELECT @@session.old_passwords, @@global.old_passwords; +-------------------------+------------------------+ 
| @@session.old_passwords | @@global.old_passwords | 
+-------------------------+------------------------+ 
| 1 | 1 | 
+-------------------------+------------------------+ 

mysql> SET @@session.old_passwords = 0; SET @@global.old_passwords=0; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT @@session.old_passwords, @@global.old_passwords; 
+-------------------------+------------------------+ 
| @@session.old_passwords | @@global.old_passwords | 
+-------------------------+------------------------+ 
| 0 | 0 | 
+-------------------------+------------------------+ 
1 row in set (0.00 sec) 

mysql> SET PASSWORD FOR 'authdtestuser'@'localhost' = PASSWORD('sshthisisasecret'); 
Query OK, 0 rows affected (0.00 sec) 

mysql> select User , Password from mysql.user where User = 'authdtestuser'; 
+---------------+-------------------------------------------+ 
| User | Password | 
+---------------+-------------------------------------------+ 
| authdtestuser | *E48BD8BF1B9F29459E5284AD158443B5B33B70E4 | 
+---------------+-------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SET @@session.old_passwords = 1; SET @@global.old_passwords=1; 

mysql> SELECT @@session.old_passwords, @@global.old_passwords; 
+-------------------------+------------------------+ 
| @@session.old_passwords | @@global.old_passwords | 
+-------------------------+------------------------+ 
| 1 | 1 | 
+-------------------------+------------------------+ 
1 row in set (0.00 sec) 

terça-feira, 15 de julho de 2014

MySQL, Ubuntu :: mysqld não tem os direitos de acesso

Original post: http://anothermysqldba.blogspot.com/2014/07/mysql-ubuntu-mysqld-does-not-have.html

Então, hoje eu acontecem a necessidade de restaurar um banco de dados MySQL a partir de backups para que eu pudesse recuperar algumas tabelas. Enquanto eu deixei ele de banco de dados de produção em execução através da porta 3306, eu configurar o backup via porta 3307. 

No entanto, quando tentou iniciar uma outra versão através da porta 3307 em um diretório mysql_restore mas eu tive alguns erros .... 


/usr/bin/mysqld_safe --defaults-file=/etc/my_3307.cnf 

[Warning] Can't create test file /var/lib/mysql_restore/localhost.lower-test 
[Warning] Can't create test file /var/lib/mysql_restore/localhost.lower-test 
Can't find file: './mysql/plugin.frm' (errno: 13) 

InnoDB: Completed initialization of buffer pool 
InnoDB: Operating system error number 13 in a file operation. 
InnoDB: The error means mysqld does not have the access rights to 
InnoDB: the directory. 
InnoDB: File name ./ibdata1 
InnoDB: File operation call: 'open'. 
InnoDB: Cannot continue operation. 

# perror 13 
OS error code 13: Permission denied 


Então, eu chequei primeiro as permissões no diretório, garantiu que foi definido para 700 e de propriedade de mysql. Eu também garantiu que os diretórios dentro do diretório de dados foi definido para 700 e de propriedade de mysql. O restante dos arquivos tudo pronto para 600 (-rw-rw ----). Apenas para ser seguro eu também garantiu que o disco não estava cheio. 

Então, o log de erro mostra problemas de permissão, mas à primeira vista todas as permissões estão corretas. Então o que é? 

Bem, se eu estivesse no RHEL, ou actividades afins, eu pensaria em SELinux. Foi bloqueá-lo de alguma forma. 
O Ubuntu AppArmor precisava ser revisto neste caso. 


# cat /etc/apparmor.d/usr.sbin.mysqld 
... 
/var/lib/mysql/ r, 
/var/lib/mysql/** rwk, 
... 


Observe que o padrão "var / lib / mysql" está sendo abordado. O diretório restaurar eu criei não foi embora. Assim, acrescentando que e um reinício do AppArmor Eu era então capaz de iniciar o MySQL com sucesso. 


# vi /etc/apparmor.d/usr.sbin.mysqld 
... 
/var/lib/mysql/ r, 
/var/lib/mysql/** rwk, 
/var/lib/mysql_restore/ r, 
/var/lib/mysql_restore/** rwk, 
... 
/etc/init.d/apparmor {start|stop|restart|reload|force-reload|status|recache} 
/var/lib/mysql_restore# /etc/init.d/apparmor restart 
... 
/usr/bin/mysqld_safe --defaults-file=/etc/my_3307.cnf 
... 
# mysql -P 3307 --socket=/var/lib/mysql_restore/mysqld_3307.sock 



URLs adicionais para a revisão, se necessário: