Maison >base de données >tutoriel mysql >Concentrez-vous sur l'enregistrement du processus de migration de données au niveau d'un million de Mysql !
Supposons qu'un tel scénario existe, qu'un petit programme soit développé, et profitant de la popularité de l'événement Double Eleven, il accumule rapidement plus d'un million d'utilisateurs en un mois. Nous ajoutons un point d'enfouissement pour collecter des formulaires sur le petit. page du programme pour envoyer des notifications de message de modèle aux utilisateurs de WeChat.
À mesure que la quantité de données augmente, l'espace serveur utilisé auparavant commence à être un peu insuffisant. Récemment, j'ai écrit un nouveau framework spécifiquement pour le développement backend de petits programmes, je souhaite donc migrer les données d'origine vers la base de données du. nouveau système. J'ai acheté une machine 8G à 4 cœurs et j'ai commencé la migration des données. Faisons un simple enregistrement du processus de migration.
Dans le développement normal, la méthode de sauvegarde et de migration des données que nous utilisons souvent consiste à utiliser l'outil mysqldump pour exporter un fichier SQL, puis à importer SQL dans la nouvelle base de données. pour terminer la migration des données. [Recommandé : Tutoriel vidéo mysql]
Des expériences ont montré qu'il faut quelques minutes pour exporter une base de données de niveau million dans un fichier SQL via mysqldump. La taille du fichier SQL exporté est d'environ 1 Go, puis 1 Go SQL. La copie du fichier sur un autre serveur à l'aide de la commande scp peut prendre quelques minutes. J'ai utilisé la commande source pour importer des données dans la base de données du nouveau serveur. Je l'ai exécuté toute la nuit et les données n'ont pas été importées. Le processeur était plein.
Migration de script
Utiliser directement la base de données via la ligne de commande pour exporter et importer des données est un moyen plus pratique, mais lorsque la quantité de données est importante, cela prend souvent plus de temps et nécessite des performances de serveur plus élevées. . Si le temps requis pour la migration des données n'est pas très long, vous pouvez essayer d'écrire un script pour migrer les données. Bien que je ne l'aie pas réellement essayé, je pense qu'il existe probablement deux solutions de script.
La première méthode consiste à exécuter un script de migration sur le serveur cible de la migration, à se connecter à distance à la base de données du serveur de données source, à lire les données source en morceaux en définissant des conditions de requête et à les écrire dans la base de données cible après la lecture. Cette méthode de migration peut être relativement inefficace. L'exportation et l'importation de données sont équivalentes à un processus synchrone et vous devez attendre la fin de la lecture avant d'écrire. Si les conditions de requête sont conçues de manière raisonnable, plusieurs scripts de migration peuvent également être démarrés de manière multithread pour obtenir l'effet de migration parallèle.
La deuxième méthode peut être combinée avec redis pour construire une solution de migration « production + consommation ». Le serveur de données source peut servir de producteur de données, exécutant un script multithread sur le serveur de données source, lisant les données dans la base de données en parallèle et écrivant les données dans la file d'attente Redis. En tant que consommateur, le serveur cible exécute également un script multithread sur le serveur cible, se connecte à distance à Redis, lit les données dans la file d'attente Redis en parallèle et écrit les données lues dans la base de données cible. Par rapport à la première méthode, cette méthode est une solution asynchrone. L'importation et l'exportation de données peuvent être effectuées en même temps. En utilisant Redis comme station de transfert de données, l'efficacité sera grandement améliorée.
Ici, vous pouvez également utiliser le langage Go pour écrire des scripts de migration. Grâce à ses fonctionnalités de concurrence natives, vous pouvez atteindre l'objectif de migration des données en parallèle et améliorer l'efficacité de la migration.
Migration de fichiers
La première solution de migration est trop inefficace, et la deuxième solution de migration est plus coûteuse à coder Grâce à la comparaison et à l'analyse des informations trouvées en ligne, j'ai finalement choisi d'utiliser MySQL. La commande de
select data into outfile file.txt、load data infile file.txt into table
finalise la migration de millions de données sous forme de fichiers d'import et d'export.
Exporter le fichier de données dans la base de données source
select * from dc_mp_fans into outfile '/data/fans.txt';
Copiez le fichier de données sur le serveur cible
zip fans.zip /data/fans.txtscp fans.zip root@ip:/data/
Importez le fichier dans la base de données cible
unzip /data/fans.zipload data infile '/data/fans.txt' into table wxa_fans(id,appid,openid,unionid,@dummy,created_at,@dummy,nickname,gender,avatar_url,@dummy,@dummy,@dummy,@dummy,language,country,province,city,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy);
Suivez ces quelques étapes et effectuez une centaine de tâches en quelques minutes Migration inter-serveurs de tables de données de niveau 10 000.
Notes
L'exécution des commandes de chargement des données infile et into outfile dans mysql nécessite que l'option secure_file_priv soit activée dans mysql, qui peut être visualisée via show global variables comme '% secure%'; Si mysql a cette option activée, la valeur par défaut Null indique que les commandes d'importation et d'exportation ne sont pas autorisées à être exécutées.
Modifiez l'élément de configuration mysql via vim /etc/my.cnf et définissez la valeur de secure_file_priv sur vide :
[mysqld] secure_file_priv=''
Ensuite, vous pouvez importer et exporter des fichiers de données via des commandes.
Dans l'exemple ci-dessus, les données sont migrées de la table dc_mp_fans de la base de données source vers la table wxa_fans de la base de données cible. Les champs des deux tables de données sont : dc_mp_fans.
wxa_fans
Lors de l'importation de données, vous pouvez définir le nom du champ pour qu'il corresponde aux données du champ cible et supprimer les données inutiles du champ cible via @dummy.
Basé sur cette expérience de migration de données, le résumé est le suivant :
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!