mirror of
https://github.com/kedarvj/mysqldumpsplitter.git
synced 2025-08-21 15:52:00 +02:00
Complete Rewirte
Complete rewrite. Added extract all DB.
This commit is contained in:
@@ -1,7 +1,25 @@
|
||||
#!/bin/sh
|
||||
# http://kedar.nitty-witty.com
|
||||
# Source: http://kedar.nitty-witty.com/blog/mydumpsplitter-extract-tables-from-mysql-dump-shell-script
|
||||
#SPLIT DUMP FILE INTO INDIVIDUAL TABLE DUMPS
|
||||
|
||||
# Current Version: 3.0
|
||||
# Extracts database, table, all databases, all tables or tables matching on regular expression from the mysqldump.
|
||||
# Includes output compression options.
|
||||
# By: Kedar Vaijanapurkar
|
||||
# Website: http://kedar.nitty-witty.com/blog
|
||||
# Original Blog Post: http://kedar.nitty-witty.com/blog/mydumpsplitter-extract-tables-from-mysql-dump-shell-script
|
||||
# Follow GIT: https://github.com/kedarvj/mysqldumpsplitter/
|
||||
|
||||
## Version Info:
|
||||
# Ver. 1.0: Feb 11, 2010
|
||||
# ... Initial version extract table(s) based on name, regexp or all of them from database-dump.
|
||||
# Ver. 2.0: Feb, 2015
|
||||
# ... Added database extract and compression
|
||||
# Ver. 3.0: March, 2015
|
||||
# ... Complete rewrite.
|
||||
# ... Extract all databases.
|
||||
##
|
||||
|
||||
# ToDo: Work with straming input
|
||||
## Formating Colour
|
||||
# Text color variables
|
||||
txtund=$(tput sgr 0 1) # Underline
|
||||
txtbld=$(tput bold) # Bold
|
||||
@@ -14,46 +32,163 @@ txtcyn=$(tput setaf 6) # Cyan
|
||||
txtwht=$(tput setaf 7) # White
|
||||
txtrst=$(tput sgr0) # Text reset
|
||||
|
||||
TARGET_DIR="."
|
||||
DUMP_FILE=$1
|
||||
TABLE_COUNT=0
|
||||
## Variable Declaration
|
||||
SOURCE_DUMP='';
|
||||
OBJECT_NAME='';
|
||||
EXTRACT='';
|
||||
OUT_DIR='out';
|
||||
EXT="sql.gz";
|
||||
TABLE_NAME='';
|
||||
DB_NAME='';
|
||||
|
||||
if [ $# = 0 ]; then
|
||||
echo "${txtbld}${txtred}Usage: sh MyDumpSplitter.sh DUMP-FILE-NAME${txtrst} -- Extract all tables as a separate file from dump."
|
||||
echo "${txtbld}${txtred} sh MyDumpSplitter.sh DUMP-FILE-NAME TABLE-NAME ${txtrst} -- Extract single table from dump."
|
||||
echo "${txtbld}${txtred} sh MyDumpSplitter.sh DUMP-FILE-NAME -S TABLE-NAME-REGEXP ${txtrst} -- Extract tables from dump for specified regular expression."
|
||||
exit;
|
||||
elif [ $# = 1 ]; then
|
||||
#Loop for each tablename found in provided dumpfile
|
||||
for tablename in $(grep "Table structure for table " $1 | awk -F"\`" {'print $2'})
|
||||
do
|
||||
#Extract table specific dump to tablename.sql
|
||||
sed -n "/^-- Table structure for table \`$tablename\`/,/^-- Table structure for table/p" $1 > $TARGET_DIR/$tablename.sql
|
||||
TABLE_COUNT=$((TABLE_COUNT+1))
|
||||
done;
|
||||
elif [ $# = 2 ]; then
|
||||
for tablename in $(grep -E "Table structure for table \`$2\`" $1| awk -F"\`" {'print $2'})
|
||||
do
|
||||
echo "Extracting $tablename..."
|
||||
#Extract table specific dump to tablename.sql
|
||||
sed -n "/^-- Table structure for table \`$tablename\`/,/^-- Table structure for table/p" $1 > $TARGET_DIR/$tablename.sql
|
||||
TABLE_COUNT=$((TABLE_COUNT+1))
|
||||
done;
|
||||
elif [ $# = 3 ]; then
|
||||
|
||||
if [ $2 = "-S" ]; then
|
||||
for tablename in $(grep -E "Table structure for table \`$3" $1| awk -F"\`" {'print $2'})
|
||||
do
|
||||
echo "Extracting $tablename..."
|
||||
#Extract table specific dump to tablename.sql
|
||||
sed -n "/^-- Table structure for table \`$tablename\`/,/^-- Table structure for table/p" $1 > $TARGET_DIR/$tablename.sql
|
||||
TABLE_COUNT=$((TABLE_COUNT+1))
|
||||
done;
|
||||
else
|
||||
echo "${txtbld}${txtred} Please provide proper parameters. ${txtrst}";
|
||||
fi
|
||||
fi
|
||||
## Usage Description
|
||||
usage()
|
||||
{
|
||||
echo "${txtgrn}${txtund}************ Usage ************ "${txtrst};
|
||||
echo "${txtgrn}sh mysqldumpsplitter.sh --source filename --extract [DB|TABLE|ALLDBS|ALLTABLES|REGEXP] --match_str string --compression=[gzip|pigz|none] --output_dir=[path to output dir] ${txtrst}"
|
||||
echo "${txtund} ${txtrst}"
|
||||
echo "OPTIONS:"
|
||||
echo "${txtund} ${txtrst}"
|
||||
echo " --source: mysqldump filename (with path) to process"
|
||||
echo " --extract: Specify what to extract. Possible values DB, TABLE, ALLDBS, ALLTABLES, REGEXP"
|
||||
echo " --match_str: Specify match string for extract command option."
|
||||
echo " --compression: gzip/pigz/no_compression (default: gzip) "
|
||||
echo " --output_dir: path to output dir. (default: ./out/)"
|
||||
echo ""
|
||||
echo "${txtund} ${txtrst}"
|
||||
exit 0;
|
||||
}
|
||||
|
||||
#Summary
|
||||
echo "${txtbld}$TABLE_COUNT Table extracted from $DUMP_FILE at $TARGET_DIR${txtrst}"
|
||||
|
||||
## Parsing and processing input
|
||||
parse_result()
|
||||
{
|
||||
|
||||
## Validate SOURCE_DUMP is provided and exists
|
||||
if [ -z $SOURCE_DUMP ]; then
|
||||
echo "${txtred}ERROR: Source file not specified or does not exist. (Entered: $SOURCE_DUMP)${txtrst}"
|
||||
elif [ ! -f $SOURCE_DUMP ]; then
|
||||
echo "${txtred}ERROR: Source file does not exist. (Entered: $SOURCE_DUMP)${txtrst}"
|
||||
exit 2;
|
||||
fi
|
||||
|
||||
## Parse Extract Operation
|
||||
case $EXTRACT in
|
||||
DB|TABLE|ALLDBS|ALLTABLES|REGEXP ) ;;
|
||||
* ) echo "${txtred}ERROR:Wrong option for --extract.${txtrst}"
|
||||
usage;
|
||||
esac;
|
||||
|
||||
## Parse compression
|
||||
if [ "$COMPRESSION" = 'none' ]; then
|
||||
COMPRESSION='cat';
|
||||
EXT="sql"
|
||||
echo "${txtgrn}Setting no compression.${txtrst}";
|
||||
elif [ "$COMPRESSION" = 'pigz' ]; then
|
||||
which $COMPRESSION
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "${txtred}WARNING:$COMPRESSION appears having issues, using default gzip.${txtrst}";
|
||||
COMPRESSION="gzip";
|
||||
fi;
|
||||
echo "${txtgrn}Setting compression as $COMPRESSION.${txtrst}";
|
||||
EXT="sql.gz"
|
||||
else
|
||||
COMPRESSION='gzip';
|
||||
echo "${txtgrn}Using default compression $COMPRESSION.${txtrst}";
|
||||
EXT="sql.gz"
|
||||
fi;
|
||||
|
||||
# Output directory
|
||||
mkdir -p $OUT_DIR
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "${txtgrn}Settingup output directory: $OUT_DIR.${txtrst}";
|
||||
else
|
||||
echo "${txtred}ERROR:Issue while checking output directory: $OUT_DIR.${txtrst}";
|
||||
exit 2;
|
||||
fi;
|
||||
|
||||
echo "${txtylw}Processing: Extract $OBJECT_NAME from $SOURCE_DUMP with compression option as $COMPRESSION and output location as $OUT_DIR${txtrst}";
|
||||
|
||||
}
|
||||
|
||||
## Actual dump splitting
|
||||
dumpsplitter()
|
||||
{
|
||||
case $EXTRACT in
|
||||
DB)
|
||||
echo "Extracting Database: $OBJECT_NAME";
|
||||
sed -n "/^-- Current Database: \`$OBJECT_NAME\`/,/^-- Current Database: /p" $SOURCE_DUMP | $COMPRESSION > $OUT_DIR/$OBJECT_NAME.$EXT
|
||||
echo "${txtbld} Database $OBJECT_NAME extracted from $SOURCE_DUMP at $OUTFILE${txtrst}"
|
||||
;;
|
||||
|
||||
TABLE)
|
||||
#Loop for each tablename found in provided dumpfile
|
||||
echo "Extracting $OBJECT_NAME."
|
||||
#Extract table specific dump to tablename.sql
|
||||
sed -n "/^-- Table structure for table \`$OBJECT_NAME\`/,/^-- Table structure for table/p" $SOURCE_DUMP | $COMPRESSION > $OUT_DIR/$OBJECT_NAME.$EXT
|
||||
echo "${txtbld} Table $OBJECT_NAME extracted from $SOURCE_DUMP at $OUTFILE${txtrst}"
|
||||
;;
|
||||
|
||||
ALLDBS)
|
||||
for dbname in $(grep -E "^-- Current Database: " $SOURCE_DUMP| awk -F"\`" {'print $2'})
|
||||
do
|
||||
echo "Extracting Database $dbname..."
|
||||
#Extract database specific dump to database.sql.gz
|
||||
sed -n "/^-- Current Database: \`$dbname\`/,/^-- Current Database: /p" $SOURCE_DUMP | $COMPRESSION > $OUT_DIR/$dbname.$EXT
|
||||
DB_COUNT=$((DB_COUNT+1))
|
||||
echo "${txtbld}Database $dbname extracted from $DUMP_FILE at $OUT_DIR/$dbname.$EXT${txtrst}"
|
||||
done;
|
||||
echo "${txtbld}Total $DB_COUNT databases extracted.${txtrst}"
|
||||
;;
|
||||
|
||||
ALLTABLES)
|
||||
for tablename in $(grep "Table structure for table " $SOURCE_DUMP | awk -F"\`" {'print $2'})
|
||||
do
|
||||
#Extract table specific dump to tablename.sql
|
||||
sed -n "/^-- Table structure for table \`$tablename\`/,/^-- Table structure for table/p" $SOURCE_DUMP | $COMPRESSION > $OUT_DIR/$tablename.$EXT
|
||||
TABLE_COUNT=$((TABLE_COUNT+1))
|
||||
echo "${txtbld}Table $tablename extracted from $DUMP_FILE at $OUT_DIR/$tablename.$EXT${txtrst}"
|
||||
done;
|
||||
echo "${txtbld}Total $TABLE_COUNT tables extracted.${txtrst}"
|
||||
;;
|
||||
REGEXP)
|
||||
TABLE_COUNT=0;
|
||||
for tablename in $(grep -E "Table structure for table \`$OBJECT_NAME" $SOURCE_DUMP| awk -F"\`" {'print $2'})
|
||||
do
|
||||
echo "Extracting $tablename..."
|
||||
#Extract table specific dump to tablename.sql
|
||||
sed -n "/^-- Table structure for table \`$tablename\`/,/^-- Table structure for table/p" $SOURCE_DUMP | $COMPRESSION > $OUT_DIR/$tablename.$EXT
|
||||
echo "${txtbld}Table $tablename extracted from $DUMP_FILE at $OUT_DIR/$tablename.$EXT${txtrst}"
|
||||
TABLE_COUNT=$((TABLE_COUNT+1))
|
||||
done;
|
||||
echo "${txtbld}Total $TABLE_COUNT tables extracted.${txtrst}"
|
||||
;;
|
||||
|
||||
*) echo "Wrong option, exiting.";;
|
||||
esac
|
||||
}
|
||||
|
||||
# Accepts Parameters
|
||||
while [ "$1" != "" ]; do
|
||||
case $1 in
|
||||
--source|-S ) shift
|
||||
SOURCE_DUMP=$1 ;;
|
||||
--extract|-E ) shift
|
||||
EXTRACT=$1 ;;
|
||||
--compression|-C ) shift
|
||||
COMPRESSION=$1 ;;
|
||||
--output_dir|-O ) shift
|
||||
OUT_DIR=$1 ;;
|
||||
--match_str|-M ) shift
|
||||
OBJECT_NAME=$1 ;;
|
||||
-h ) usage
|
||||
exit ;;
|
||||
* ) echo "";
|
||||
usage
|
||||
exit 1
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
parse_result
|
||||
dumpsplitter
|
||||
|
Reference in New Issue
Block a user