Maison >base de données >tutoriel mysql >Comment diviser les sorties Mysqldump en fichiers plus petits pour un téléchargement plus facile sur le serveur ?

Comment diviser les sorties Mysqldump en fichiers plus petits pour un téléchargement plus facile sur le serveur ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-17 03:06:031064parcourir

How to Split Mysqldump Outputs into Smaller Files for Easier Server Upload?

Diviser les sorties Mysqldump en fichiers plus petits pour le téléchargement sur le serveur

Lorsque vous essayez de déplacer des données de table d'une base de données MySQL à une autre, des limitations de taille de fichier peuvent survenir. Si la sortie de mysqldump dépasse la taille autorisée pour le téléchargement, une méthode est nécessaire pour diviser la sortie en fichiers plus petits.

Une solution consiste à utiliser l'option --extended-insert=FALSE avec mysqldump. Cela crée un fichier .sql qui peut être divisé en utilisant split(1) avec une option --lines appropriée. Cependant, si cat(1) ne peut pas être utilisé sur le serveur distant, cette méthode devient irréalisable.

Alternativement, un script bash peut être utilisé pour diviser le fichier de vidage en fichiers distincts pour chaque table. Le script utilise csplit pour diviser le fichier en fonction de modèles spécifiques, tels que la structure des tables ou les noms des tables.

Voici un exemple de script :

#!/bin/bash

START="/-- Table structure for table/"

if [ $# -lt 1 ] || [[  == "--help" ]] || [[  == "-h" ]]; then
  echo "USAGE: extract all tables:"
  echo "  DUMP_FILE"
  echo "extract one table:"
  echo "  DUMP_FILE [TABLE]"
  exit
fi

if [ $# -ge 2 ]; then
  # extract one table 
  csplit -s -ftable  "/-- Table structure for table/" "%-- Table structure for table \`\`%" "/-- Table structure for table/" "%40103 SET TIME_ZONE=@OLD_TIME_ZONE%1"
else
  # extract all tables
  csplit -s -ftable  "$START" {*}
fi

[ $? -eq 0 ] || exit

mv table00 head

FILE=`ls -1 table* | tail -n 1`
if [ $# -ge 2 ]; then
  # cut off all other tables
  mv $FILE foot
else
  # cut off the end of each file
  csplit -b '%d' -s -f$FILE $FILE "/40103 SET TIME_ZONE=@OLD_TIME_ZONE/" {*}
  mv ${FILE}1 foot
fi

for FILE in `ls -1 table*`; do
  NAME=`head -n1 $FILE | cut -d$'\x60' -f2`
  cat head $FILE foot > "$NAME.sql"
done

rm head foot table*

Ce script suppose que le fichier de vidage d'entrée contient structures et données des tables. Il divise le fichier aux limites de la table et attribue les données de chaque table à un fichier distinct avec le nom de fichier approprié.

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn