Maison  >  Article  >  base de données  >  Comment résoudre le problème selon lequel MySQL ne démarre pas après le déplacement du répertoire de données

Comment résoudre le problème selon lequel MySQL ne démarre pas après le déplacement du répertoire de données

WBOY
WBOYavant
2023-05-26 10:13:052405parcourir

Aperçu de l'arrière-plan

Étant donné que le répertoire de données MySQL a été placé dans le répertoire racine lors de l'installation de la base de données, l'espace de stockage est désormais insuffisant. Je souhaite déplacer le répertoire de données vers un autre répertoire via mv, mais les données Une fois le répertoire déplacé vers un autre répertoire de données, le démarrage de la base de données échoue.

Problem Recurrence

Ce test est basé sur MySQL 8.0.31

1 Fermez la base de données

mysql> shutdown;
Query OK, 0 rows affected (0.02 sec)

2. . Affichez l'emplacement du répertoire de données actuel

shell> pwd
/mysql80

3 Déplacez l'intégralité du répertoire de données MySQL vers un autre répertoire via mv

shell>  mv /mysql80 /data
shell>  cd /data/mysql80/svr
shell>  ln -s mysql-8.0.31-linux-glibc2.12-x86_64 mysql

4.
shell> chown -R mysql.mysql /data
#🎜 🎜#5. Modifiez l'adresse du répertoire de données dans le fichier de configuration

shell> sed -i 's#/mysql80#/data/mysql80#g' my5001.cnf

6. Démarrez la base de données

shell> /data/mysql80/svr/mysql/bin/mysqld_safe \
--defaults-file=/data/mysql80/conf/my5001.cnf --user=mysql &

À ce moment, le démarrage de la base de données a échoué, et le journal des erreurs a signalé l'erreur suivante :

# 🎜🎜#

mysqld : Fichier '/mysql80/dbdata/data5001/log/binlog.000012' introuvable (OS errno 2 - Aucun fichier ou répertoire de ce type )

2023-02-27T10:38:09.240576 +08:00 0 [ERREUR] [MY-010958] [Serveur] Impossible d'ouvrir le fichier journal.
2023-02-27T10:38:09.240657+ 08:00 0 [ERREUR] [MY-010041] [Serveur] ] Impossible d'initialiser le journal tc

2023-02-27T10:38:09.240718+08:00 0 [ERREUR] [MY-010119] [Serveur ] Abandon
2023-02-27T10:38:10.548605 +08:00 0 [Système] [MY-010910] [Serveur] /data/mysql80/svr/mysql/bin/mysqld : Arrêt terminé (mysqld 8.0. 31) MySQL Community Server - GPL.
#🎜🎜 #
L'erreur signalée ici montre que le fichier binlog est introuvable et que le répertoire de binlog code> affiché dans l'erreur est toujours le même qu'avant, mais le répertoire dans le fichier de configuration a été modifié#🎜🎜 #<pre class="brush:bash;">shell&gt; grep &amp;#39;log-bin&amp;#39; my5001.cnf log-bin=/data/mysql80/dbdata/data5001/log/binlog log-bin-trust-function-creators</pre><br>7 Résolution de problèmes

Enfin, grâce à la recherche, il a été constaté que le chemin absolu de chaque fichier binlog est stocké dans l'adresse du fichier binlog.index, le chemin ici est toujours le chemin précédent, le contenu est le suivant : # 🎜🎜#
shell> cat binlog.index 
/mysql80/dbdata/data5001/log/binlog.000001
/mysql80/dbdata/data5001/log/binlog.000002
/mysql80/dbdata/data5001/log/binlog.000003
/mysql80/dbdata/data5001/log/binlog.000004
/mysql80/dbdata/data5001/log/binlog.000005
/mysql80/dbdata/data5001/log/binlog.000006
/mysql80/dbdata/data5001/log/binlog.000007
/mysql80/dbdata/data5001/log/binlog.000008
/mysql80/dbdata/data5001/log/binlog.000009
/mysql80/dbdata/data5001/log/binlog.000010
/mysql80/dbdata/data5001/log/binlog.000011
/mysql80/dbdata/data5001/log/binlog.000012

Modifiez le chemin absolu de binlog dans le fichier binlog.index : binlog文件,并且报错显示的binlog的目录还是之前的,但是配置文件中的目录已经修改

shell> sed -i &#39;s#/mysql80#/data/mysql80#g&#39; binlog.index
shell> cat binlog.index 
/data/mysql80/dbdata/data5001/log/binlog.000001
/data/mysql80/dbdata/data5001/log/binlog.000002
/data/mysql80/dbdata/data5001/log/binlog.000003
/data/mysql80/dbdata/data5001/log/binlog.000004
/data/mysql80/dbdata/data5001/log/binlog.000005
/data/mysql80/dbdata/data5001/log/binlog.000006
/data/mysql80/dbdata/data5001/log/binlog.000007
/data/mysql80/dbdata/data5001/log/binlog.000008
/data/mysql80/dbdata/data5001/log/binlog.000009
/data/mysql80/dbdata/data5001/log/binlog.000010
/data/mysql80/dbdata/data5001/log/binlog.000011
/data/mysql80/dbdata/data5001/log/binlog.000012

7.问题解决

最后通过查找发现 binlog.index 文件中存放着每个binlog文件的绝对路径地址,这里的路径还是之前路径,内容如下:

shell> /data/mysql80/svr/mysql/bin/mysqld_safe 
--defaults-file=/data/mysql80/conf/my5001.cnf --user=mysql &

修改binlog.index文件中binlog的绝对路径:

sed -i &#39;s#/mysql80#/data/mysql80#g&#39; relaylog.index

8.启动数据库

# 重启实例
mysql> restart;
# 启动主从复制
mysql> start replica;

数据库启动成功。

9.作为从节点

需要注意的是,如果该实例还作为其他实例的从节点,还需要设置 relaylog.index 文件中relay log的绝对路径,否则会报如下错误: 错误日志报错:

2023-02-27T15:56:55.224372+08:00 0 [ERROR] [MY-010599] [Repl] log /mysql80/dbdata/data5002/log/relaylog.000002 listed in the index, but failed to stat.
2023-02-27T15:56:55.224422+08:00 0 [ERROR] [MY-011059] [Repl] Error counting relay log space.
2023-02-27T15:56:55.226571+08:00 0 [ERROR] [MY-010426] [Repl] Slave: Failed to initialize the master info structure for channel ''; its record may still be present in 'mysql.slave_master_info' table, consider deleting it.
2023-02-27T15:56:55.226622+08:00 0 [ERROR] [MY-010529] [Repl] Failed to create or recover replication info repositories.

执行 start replica 时也会报错:

# 客户端报错
mysql> start replica;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
# error log报错
2023-02-27T15:57:53.858798+08:00 8 [ERROR] [MY-013124] [Repl] Slave SQL for channel '': Slave failed to initialize relay log info structure from the repository, Error_code: MY-013124

10.问题解决

修改 relaylog.index rrreee

8. 🎜🎜#rrreee

La base de données a démarré avec succès.

9. En tant que nœud esclave

#🎜🎜# Il est à noter que si cette instance sert également de nœud esclave pour d'autres instances, vous devez également définir le chemin absolu du journal de relais dans le fichier relaylog.index, sinon l'erreur suivante sera signalée : Erreur de journal d'erreur : #🎜🎜##🎜🎜##🎜🎜#2023-02-27T15:56:55.224372+08:00 0 [ERREUR. ] [MY-010599] [Repl] journal / mysql80/dbdata/data5002/log/relaylog.000002 répertorié dans l'index, mais n'a pas réussi à stat.#🎜🎜#2023-02-27T15:56:55.224422+08:00 0 [ERREUR] [MY-011059] [Repl] Erreur de comptage de l'espace du journal du relais.#🎜🎜#2023-02-27T15:56:55.226571+08:00 0 [ERREUR] [MY-010426] [Repl] Esclave : échec de initialisez la structure d'information principale du canal '' ; son enregistrement peut toujours être présent dans la table 'mysql.slave_master_info', pensez à le supprimer.#🎜🎜#2023-02-27T15:56:55.226622+08:00 0 [ERREUR] [ MY-010529] [Repl] Échec de la création ou de la récupération des référentiels d'informations de réplication.#🎜🎜##🎜🎜##🎜🎜#Une erreur sera également signalée lors de l'exécution de la réplique de démarrage : #🎜🎜##🎜🎜##🎜🎜 ## Erreur client #🎜🎜#mysql> démarrer la réplique #🎜🎜#ERROR 1872 (HY000) : l'esclave n'a pas réussi à initialiser la structure des informations du journal de relais à partir du référentiel#🎜🎜## erreur du journal des erreurs#🎜🎜#2023-02- 27T15:57:53.858798+08:00 8 [ERREUR] [MY-013124] [Repl] SQL de l'esclave pour le canal '' : l'esclave n'a pas réussi à initialiser la structure des informations du journal de relais à partir du référentiel, code d'erreur : MY-013124#🎜🎜## 🎜🎜##🎜🎜#10.Solution du problème#🎜 🎜##🎜🎜#Modifier le chemin absolu du journal du relais dans le fichier relaylog.index#🎜🎜#rrreee#🎜🎜#Redémarrer le base de données et démarrez la réplication maître-esclave#🎜🎜#rrreee#🎜🎜 #À ce stade, la réplication maître-esclave revient à la normale. #🎜🎜#

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer