source

모든 mysql 테이블을 자동으로 별도의 파일로 덤프하시겠습니까?

manysource 2022. 12. 24. 17:44

모든 mysql 테이블을 자동으로 별도의 파일로 덤프하시겠습니까?

각 mysql 테이블의 덤프를 다른 파일로 만들고 싶습니다.설명서에 따르면 이 구문은 다음과 같습니다.

mysqldump [options] db_name [tbl_name ...]

테이블 이름을 미리 알고 있다는 뜻입니다.각 테이블 이름을 알고 있는 스크립트를 셋업할 수 있지만, 나중에 새 테이블을 추가하고 덤프 스크립트를 업데이트하는 것을 잊었다고 칩니다.그럼 하나 이상의 테이블에 대한 덤프가 없어졌군

기존의 각 테이블을 다른 파일에 자동으로 덤프하는 방법이 있습니까?또는 데이터베이스 쿼리, 모든 테이블 이름 가져오기 및 이름별로 덤프하는 스크립트푸를 수행해야 합니다.

script-fu 루트를 사용할 경우 mysql 데이터베이스에 액세스할 수 있는 스크립트 랭귀지는 무엇입니까?

다음은 테이블 데이터를 SQL 명령으로 별도의 압축 파일로 덤프하는 스크립트입니다.MySQL 서버 호스트에 있을 필요가 없으며 스크립트에서 암호를 하드 코드하지 않으며 서버의 모든 DB가 아닌 특정 DB를 위한 것입니다.

#!/bin/bash

# dump-tables-mysql.sh
# Descr: Dump MySQL table data into separate SQL files for a specified database.
# Usage: Run without args for usage info.
# Author: @Trutane
# Ref: http://stackoverflow.com/q/3669121/138325
# Notes:
#  * Script will prompt for password for db access.
#  * Output files are compressed and saved in the current working dir, unless DIR is
#    specified on command-line.

[ $# -lt 3 ] && echo "Usage: $(basename $0) <DB_HOST> <DB_USER> <DB_NAME> [<DIR>]" && exit 1

DB_host=$1
DB_user=$2
DB=$3
DIR=$4

[ -n "$DIR" ] || DIR=.
test -d $DIR || mkdir -p $DIR

echo -n "DB password: "
read -s DB_pass
echo
echo "Dumping tables into separate SQL command files for database '$DB' into dir=$DIR"

tbl_count=0

for t in $(mysql -NBA -h $DB_host -u $DB_user -p$DB_pass -D $DB -e 'show tables') 
do 
    echo "DUMPING TABLE: $DB.$t"
    mysqldump -h $DB_host -u $DB_user -p$DB_pass $DB $t | gzip > $DIR/$DB.$t.sql.gz
    tbl_count=$(( tbl_count + 1 ))
done

echo "$tbl_count tables dumped from database '$DB' into dir=$DIR"

mysqldump 명령줄 프로그램은 이 기능을 제공합니다.단, 문서에서는 이 기능에 대해 매우 불명확합니다.

주의할 점은 mysqld를 소유한 사용자가 ~/output/dir에 쓸 수 있어야 한다는 것입니다.Mac OS X의 경우:

sudo chown -R _mysqld:_mysqld ~/output/dir
mysqldump --user=dbuser --password --tab=~/output/dir dbname

상기의 실행 후에, 1 개의 tablename 이 표시됩니다.각 테이블의 스키마(테이블 문 만들기)와 tablename이 들어 있는 sql 파일.데이터를 포함하는 txt 파일.

스키마만 포함하는 덤프를 원하는 경우 --no-data 플래그를 추가합니다.

mysqldump --user=dbuser --password --no-data --tab=~/output/dir dbname

이것은, 다음의 방법으로 실행할 수 있습니다.

  1. mysql에서 데이터베이스 목록 가져오기
  2. 각 데이터베이스를 덤프하다mysqldump
# Optional variables for a backup script
MYSQL_USER="root"
MYSQL_PASS="something"
BACKUP_DIR=/srv/backup/$(date +%Y-%m-%dT%H_%M_%S);
test -d "$BACKUP_DIR" || mkdir -p "$BACKUP_DIR"
# Get the database list, exclude information_schema
for db in $(mysql -B -s -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' | grep -v information_schema)
do
  # dump each database in a separate file
  mysqldump -u $MYSQL_USER --password=$MYSQL_PASS "$db" | gzip > "$BACKUP_DIR/$db.sql.gz"
done

여기 해당 수입품이 있습니다.

#!/bin/bash

# import-files-mysql.sh
# Descr: Import separate SQL files for a specified database.
# Usage: Run without args for usage info.
# Author: Will Rubel
# Notes:
#  * Script will prompt for password for db access.

[ $# -lt 3 ] && echo "Usage: $(basename $0) <DB_HOST> <DB_USER> <DB_NAME> [<DIR>]" && exit 1

DB_host=$1
DB_user=$2
DB=$3
DIR=$4

DIR=$DIR/*


echo -n "DB password: "
read -s DB_pass
echo
echo "Importing separate SQL command files for database '$DB' into '$DB'"

file_count=0


for f in $DIR

do 
    echo "IMPORTING FILE: $f"

    gunzip -c $f | mysql -h $DB_host -u $DB_user -p$DB_pass $DB

    (( file_count++ ))
done

echo "$file_count files importing to database '$DB'"
#!/bin/bash

for i in $(mysql -uUser -pPASSWORD DATABASE -e "show tables;"|grep -v Tables_in_);do mysqldump -uUSER -pPASSWORD DATABASE $i > /backup/dir/$i".sql";done

tar -cjf "backup_mysql_"$(date +'%Y%m%d')".tar.bz2" /backup/dir/*.sql

여기 있는 사람들은 모두 잊어버린 것 같다.autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;그것은 수입 절차를 가속화할 것이다...

#!/bin/bash
MYSQL_USER="USER"
MYSQL_PASS="PASS"

if [ -z "$1" ]
  then
    echo "Dumping all DB ... in separate files"
    for I in $(mysql -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' -s --skip-column-names); 
    do 
      echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > "$I.sql"
      mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I >> "$I.sql"; 
      echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;commit;" >> "$I.sql"
      gzip "$I.sql"
    done
    echo "END."
else
      echo "Dumping $1 ..."
      echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > "$1.sql"
      mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $1 >> "$1.sql"; 
      echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;commit;" >> "$1.sql"
      gzip "$1.sql"
fi

모든 데이터베이스의 모든 테이블을 덤프하려면 Elias Torres Arroyo와 Trutane의 답변을 조합하십시오.또한 단말기에 비밀번호를 입력하지 않으려면 별도의 구성 파일(chmod 0600)에 비밀번호를 저장하십시오.cron에 의해 실행된 Mysqldump와 비밀번호 보안을 참조하십시오.

#!/bin/bash

# this file
# a) gets all databases from mysql
# b) gets all tables from all databases in a)
# c) creates subfolders for every database in a)
# d) dumps every table from b) in a single file

    # this is a mixture of scripts from Trutane (http://stackoverflow.com/q/3669121/138325) 
    # and Elias Torres Arroyo (https://stackoverflow.com/a/14711298/8398149)

# usage: 
# sk-db.bash parameters
# where pararmeters are:

# d "dbs to leave"
# t " tables to leave"
# u "user who connects to database"
# h "db host"
# f "/backup/folder"



user='root'
host='localhost'
backup_folder=''
leave_dbs=(information_schema mysql)
leave_tables=()
while getopts ":d:t:u:h:f:" opt; do
  case $opt in
    d) leave_dbs=( $OPTARG )
    ;;
    t) leave_tables=( $OPTARG )
    ;;
    u) user=$OPTARG
    ;;
    h) host=$OPTARG
    ;;
    f) backup_folder=$OPTARG
    ;;

    \?) echo "Invalid option -$OPTARG" >&2
    ;;
  esac
done
echo '****************************************'
echo "Database Backup with these options"
echo "Host $host"
echo "User $user"
echo "Backup in $backup_folder"
echo '----------------------------------------'
echo "Databases to emit:"
printf "%s\n" "${leave_dbs[@]}"
echo '----------------------------------------'
echo "Tables to emit:"
printf "%s\n" "${leave_tables[@]}"
echo '----------------------------------------'


BACKUP_DIR=$backup_folder/$(date +%Y-%m-%dT%H_%M_%S);
CONFIG_FILE=/root/db-config.cnf

function contains() {
    local n=$#
    local value=${!n}
    for ((i=1;i < $#;i++)) {
        if [ "${!i}" == "${value}" ]; then
            echo "y"
            return 0
        fi
    }
    echo "n"
    return 1
}


test -d "$BACKUP_DIR" || mkdir -p "$BACKUP_DIR"
# Get the database list, exclude information_schema
database_count=0
tbl_count=0

for db in $(mysql --defaults-extra-file=$CONFIG_FILE -B -s -u $user -e 'show databases' )
do
    if [ $(contains "${leave_dbs[@]}" "$db") == "y" ]; then
        echo "leave database $db as requested"
    else

       # dump each database in a separate file
       (( database_count++ ))
       DIR=$BACKUP_DIR/$db
       [ -n "$DIR" ] || DIR=.

       test -d $DIR || mkdir -p $DIR

       echo
       echo "Dumping tables into separate SQL command files for database '$db' into dir=$DIR"

       for t in $(mysql --defaults-extra-file=$CONFIG_FILE -NBA -h $host -u $user -D $db -e 'show tables')
       do
           if [ $(contains "${leave_tables[@]}" "$db.$t") == "y" ]; then
               echo "leave table $db.$t as requested"
           else
               echo "DUMPING TABLE: $db.$t"
  #            mysqldump --defaults-extra-file=$CONFIG_FILE -h $host -u $user $db $t  > $DIR/$db.$t.sql
               tbl_count=$(( tbl_count + 1 ))
           fi
       done

       echo "Database $db is finished"
       echo '----------------------------------------'

    fi
done
echo '----------------------------------------'
echo "Backup completed"
echo '**********************************************'

또한 다음과 같은 이점이 있습니다.

bash 어레이에 값이 포함되어 있는지 확인합니다.

배시 배열

스크립트의 명명된 인수

최근에 대용량 데이터베이스(압축되지 않은 250GB 이상의 덤프 파일)를 백업해야 하는 경우가 있었는데, 이 질문에 대한 답변이 매우 도움이 되었습니다.

나는 @Trutane 어프로치를 사용하기 시작했고, 그것은 매우 효과가 있었다.그러나 다른 mysql 세션에서 테이블을 덤프하는 것이 걱정되었습니다. 왜냐하면 어느 순간 일관성 없는 백업이 발생할 수 있기 때문입니다.

는 몇 다른 했습니다.gawk 전체의 mysqldump--single-transaction=true은 '먹다'로 해 주세요.gawk테이블마다 다른 파일을 만듭니다.

전화:

mysqldump --single-transaction=true -u DBUSERNAME -p DBNAME | \
  gawk -v 'database=DBNAME' -f 'backup.awk' -

현재에는 많은 의 파일이 $database.$table.sql 및 """ " " ""$database.$table.sql.gz모든 테이블의 내용이 포함된 파일입니다.입니다.--single-transaction=true모든 덤프가 단일 트랜잭션으로 이루어지며 데이터의 일관성이 보장됩니다.

backup.awk 말합니다

# Split mysqldump output in different files, two per table:
# * First file is named $database.$table.sql and it contains the table schema
# * Second file is named $database.$table.sql.gz and it contains the table data 

# The 'database' variable is expected to be provided in command-line
BEGIN {
    insert=0
    filename=sprintf("%s.header.sql", database);
}

# A line starting with "INSERT INTO" activates inserting mode
/INSERT INTO/       { insert=1 }

# A line containing "-- Table structure for table `name-of-table`" finishes inserting mode
# It is also used to detect table name and change file names accordingly
match($0, /-- Table structure for table `(.*)`/, m) {
    insert=0;
    table=m[1];
    filename=sprintf("%s.%s.sql", database, table);
    print sprintf("Dumping table %s\n", table);
}

# If in inserting mode, line is piped to a gzipped file,
#and else it redirected to an uncompressed schema file
{
    if (insert == 1) {
       output = sprintf("gzip > %s.gz", filename);
       print | output
    } else {
       print > filename;
    }
}

저는 bash master는 아니지만 bash 스크립트를 사용해서 하겠습니다.MySQL을 누르지 않고도 데이터 디렉토리와 데이터베이스 이름을 알고 모든 .frm 파일(이 db/디렉토리 내의 모든 테이블마다 하나씩)에서 테이블 목록을 검색할 수 있습니다.

좀 더 매끈하게 만들고 논쟁을 받아들이거나 할 수 있는 방법이 있을 것 같은데, 이 방법이 저한테는 잘 먹혔어요.

tables_in_a_db_to_sql.

#!/bin/bash

database="this_is_my_database"
datadir="/var/lib/mysql/"
datadir_escaped="\/var\/lib\/mysql\/"

all_tables=($(ls $datadir$database/*.frm | sed s/"$datadir_escaped$database\/"/""/g | sed s/.frm//g))

for t in "${all_tables[@]}"; do
        outfile=$database.$t.sql
        echo "-- backing up $t to $outfile"
        echo "mysqldump [options] $database $t > $outfile"
        # mysqldump [options] $database $t > $outfile
done

필요에 따라 [options]및 원하는 outfile 규칙을 입력하고 마지막 mysqldump 행을 주석 해제합니다.

Windows 서버의 경우는, 다음과 같은 배치 파일을 사용할 수 있습니다.

set year=%DATE:~10,4%
set day=%DATE:~7,2%
set mnt=%DATE:~4,2%
set hr=%TIME:~0,2%
set min=%TIME:~3,2%

IF %day% LSS 10 SET day=0%day:~1,1%
IF %mnt% LSS 10 SET mnt=0%mnt:~1,1%
IF %hr% LSS 10 SET hr=0%hr:~1,1%
IF %min% LSS 10 SET min=0%min:~1,1%

set backuptime=%year%-%mnt%-%day%-%hr%-%min%
set backupfldr=C:\inetpub\wwwroot\backupfiles\
set datafldr="C:\Program Files\MySQL\MySQL Server 5.5\data"
set zipper="C:\inetpub\wwwroot\backupfiles\zip\7za.exe"
set retaindays=21

:: Switch to the data directory to enumerate the folders
pushd %datafldr%

:: Get all table names and save them in a temp file
mysql --skip-column-names --user=root --password=mypassword mydatabasename -e "show tables" > tables.txt

:: Loop through all tables in temp file so that we can save one backup file per table
for /f "skip=3 delims=|" %%i in (tables.txt) do (
  set tablename = %%i
  mysqldump --user=root --password=mypassword mydatabasename %%i > "%backupfldr%mydatabasename.%backuptime%.%%i.sql"
)
del tables.txt

:: Zip all files ending in .sql in the folder
%zipper% a -tzip "%backupfldr%backup.mydatabasename.%backuptime%.zip" "%backupfldr%*.sql"

echo "Deleting all the files ending in .sql only"
del "%backupfldr%*.sql"

echo "Deleting zip files older than 21 days now"
Forfiles /p %backupfldr% /m *.zip /d -%retaindays% /c "cmd /c del /q @path"

그런 다음 윈도우즈 작업 스케줄러를 사용하여 예약합니다.

또한 백업에서 특정 테이블을 제외할 경우 "show tables" 문에 where 구를 사용할 수 있지만 열 이름은 데이터베이스 이름에 따라 달라집니다.

예를 들어 데이터베이스 이름이 "blah"일 경우 "show tables" 결과 집합의 열 이름은 "tables_in_blah"가 됩니다.즉, 다음과 같은 where 구를 추가할 수 있습니다.

show tables where tables_in_blah <> 'badtable'

또는

show tables where tables_in_blah like '%goodtable%'

Pauli Marcus의 다음 기사를 참조하십시오.

SQL 데이터베이스 덤프를 테이블 형식의 파일로 분할하는 방법

데이터베이스 전체를 포함하는 SQL 파일을 테이블 단위로 분할하는 것은 매우 간단합니다.DROP TABLE의 발생에 대해 .sql을 GREP합니다.DROP TABLE 문에 포함된 테이블 이름에서 파일 이름을 생성합니다.출력을 파일에 에코합니다.다음은 .sql 파일을 입력으로 사용하는 작은 스크립트입니다.

#!/bin/bash

file=$1 # the input file
directory="$file-splitted" # the output directory
output="$directory/header" # the first file containing the header
GREP="DROP TABLE" # what we are looking for

mkdir $directory # create the output directory

while read line
do
   # if the current line contains the wanted statement
   if [ $(echo "$line" | grep -c "$GREP") == "1" ]
   then
      # extract the file name
      myfile=$(echo $line | awk '{print $5}' | sed -e 's/`//g' -e 's/;//g')
      # set the new file name
      output="$directory/$myfile"
   fi
       echo "$line" >> $output # write to file
done < $file

언급URL : https://stackoverflow.com/questions/3669121/dump-all-mysql-tables-into-separate-files-automatically