web-dev-qa-db-fra.com

Comment créer une structure de répertoire de base de données pour MySQL?

Je suivais ce tutoriel:

https://www.digitalocean.com/community/tutorials/how-to-use-mysql-with-your-Ruby-on-Rails-application-on-ubuntu-14-04

Jusqu'ici, j'ai installé mysql-server mysql-client libmysqlclient-dev , et j’étais supposé dire à MySQL de créer sa structure de répertoires de base de données où il stockera ses informations en utilisant Sudo mysql_install_db.

$ Sudo mysql_install_db

[WARNING] mysql_install_db is deprecated. Please consider switching to mysqld --initialize
[ERROR]   The data directory needs to be specified.

Je pensais que lancer mysqld --initialize résoudrait le problème:

$ mysqld --initialize 

mysqld: Can't create directory '/var/lib/mysql/' (Errcode: 17 - File exists)
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
[ERROR] Aborting

Comment puis-je dire à MySQL de créer sa structure de répertoires de base de données où il stockera ses informations?

3
hussam

J'ai réussi à résoudre le problème en utilisant une question précédemment répondue, Comment installer mysql sur Ubuntu 16.04 , mais je devais modifier la solution pour qu'elle fonctionne à ma place.

Lorsque j'ai supprimé/déplacé le répertoire /var/lib/mysql, mysqld --initialize n'a pas pu créer le répertoire de base de données que je souhaite en remplacement de /var/lib/mysql, et il m'a donné Errcode: 13 - Permission denied même si je l'ai précédé Sudo.

J'ai supprimé/déplacé le contenu de /var/lib/mysql/, mais pas le répertoire lui-même. J'ai de nouveau essayé de lancer Sudo mysql --initialize, et cela a fonctionné. J'ai créé un nouveau contenu dans le répertoire /var/lib/mysql/. Le contenu produit par mysql --initialize est différent du contenu précédent que j'ai supprimé/déplacé.

J'ai continué le reste des étapes du tutoriel et j'ai parfaitement fonctionné.

P.S. J'avais besoin d'utiliser Sudo -i pour accéder à /var/lib/mysql.

2
hussam

C'est la solution complète pour votre problème.

Selon fromdual , il est suggéré de suivre simplement le conseil de l'erreur. Certaines fonctionnalités sont obsolètes.

Notre conseil est d'activer la variable explicit_defaults_for_timestamp maintenant sur vos systèmes de test afin de voir si votre application se comporte bien et vous êtes prêt pour la prochaine version lorsque cette fonctionnalité deviendra la valeur par défaut.

À court terme, cet avertissement n'est PAS dangereux. À long terme, vous devez être prêt pour la fonctionnalité déconseillée. Vous vous débarrassez de l'avertissement my setting explicit_defaults_for_timestamp = 1 dans votre section my.cnf [mysqld].

Vous pouvez trouver le fichier my.cnf aux emplacements suivants, et dans cet ordre les valeurs se substituent:

  • /etc/my.cnf
  • /etc/mysql/my.cnf
  • $ MYSQL_HOME/my.cnf
  • [datadir] /my.cnf
  • ~/.my.cnf

Vous pouvez aussi trouver votre fichier par

find / -name my.cnf

J'ai ajouté ce qui suit dans /etc/mysql/my.cnf

[mysqld]
explicit_defaults_for_timestamp = 1

Maintenant essaye

mysqld --initialize

Et j'ai eu une erreur réduite sans trucs d'horodatage

mysqld: Can't create directory '/var/lib/mysql/' (Errcode: 17 - File exists)
2018-11-12T20:13:45.024116Z 0 [ERROR] Aborting

Est-ce que c'est bon? Pas sûr alors je regarde plus profondément. Selon ce qui précède réponse de pile acceptée pour l’erreur vous devez

Sudo -i #log into root
cd /var/lib/mysql
rm -r *

su username  # get back to the original user

mysqld --initialize 

Ceci, m'a toujours donné exactement la même erreur. Pas de changement!

mysqld: Can't create directory '/var/lib/mysql/' (Errcode: 17 - File exists)
2018-11-12T20:13:45.024116Z 0 [ERROR] Aborting

Je ne suis pas sûr que la réponse acceptée ci-dessus ait aidé à supprimer le /var/lib/mysql, mais Sudo a aidé:

Sudo mysqld --initialize

travaillé ... pas d'erreur du tout!

0
Thej Kiran