Bonjour,
Je rencontre depuis plusieurs jours un problème que je n'ai toujours pas réussi à résoudre : J'essaye d'importer un dump d'une base de données, d'une taille de 38GB, dans ma base de données MySQL.
Le problème est qu'au bout d'un certains nombre de lignes insérées dans la base de données, le serveur commence à ralentir à tel point que l'importation durera plusieurs jours.
J'entend bien que l'importation d'un fichier de 38GB n'est pas une mince affaire pour le serveur, mais l'importation devient tellement lente que je suppose qu'un problème survient.
Comme le titre l'explique l'importation devient très, très lente après environ 400 millions de lignes insérées dans la base de données. Pour palier à ce problème j'ai testé plusieurs solutions sans aucun succès :
- Utilisation de Percona Server 5.7 à la place de MySQL 5.7
- Découper le fichier de 38GB en fichier de 1GB
- Ajouter au début de chaque fichier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0;- Ajouter à la fin de chaque fichier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 COMMIT; SET unique_checks=1; SET foreign_key_checks=1;- Modifier mon fichier my.cnf pour obtenir quelque chose qui ressemble à ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 [mysqld] key-buffer-size = 32M max-allowed-packet = 16M max-connect-errors = 1000000 tmp-table-size = 32M max-heap-table-size = 32M query-cache-type = 0 query-cache-size = 0 max-connections = 500 thread-cache-size = 50 open-files-limit = 65535 table-definition-cache = 1024 table-open-cache = 100 innodb-flush-method = O_DIRECT innodb-log-files-in-group = 2 innodb-log-file-size = 2G innodb-flush-log-at-trx-commit = 2 innodb-file-per-table = 1 innodb-buffer-pool-size = 26G- Utiliser Percona Server Wizard pour obtenir un fichier de configuration sur-mesure
- Utiliser un RAID 0 à la place d'un RAID 1 pour le serveur
Toutes ces pistes mènent au même point, autour de 400 millions de lignes l'importation devient incroyablement lente, ce qui représente environ 40% de l'importation.
Quand je parle de ralentissement c'est qu'en règle générale le fichier de 1GB met environ 30 minutes pour s'importer entièrement, et quand c'est lent je parle de plus d'une demi-journée pour le même fichier.
Chaque fichier de 1GB contient exactement 1000 requêtes INSERT INTO qui ajoute environ 30 millions de lignes par fichier de 1GB.
Table où est importé le fichier (Le moteur de base de données est InnoDB) :
Je n'ai pas la main sur le serveur qui réalise le dump, donc il m'est impossible de modifier la façon dont le fichier est généré.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 +-------------------+-----------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------------+-----------------+------+-----+---------+-------+ | pl_from | int(8) unsigned | NO | PRI | 0 | | | pl_namespace | int(11) | NO | PRI | 0 | | | pl_title | varbinary(255) | NO | PRI | | | | pl_from_namespace | int(11) | NO | MUL | 0 | | +-------------------+-----------------+------+-----+---------+-------+
Configuration du Serveur :
Intel Xeon E3-1270v6 4c/8t - 3,8 GHz/4,2 GHz
32Go DDR4 ECC 2400 MHz
SoftRaid 2x2To
Ubuntu Server 16.04
Je me tourne donc vers vous pour savoir si je suis passé à côté de quelque chose dans la configuration, ou avoir des conseils pour l'importation de ce gros fichier.
Merci d'avance.
Lien du fichier de backup :
https://wikimedia.bytemark.co.uk/enw...gelinks.sql.gz (Dump d'une des tables du Wikipédia Anglais)
Partager