모든 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
이것은, 다음의 방법으로 실행할 수 있습니다.
- mysql에서 데이터베이스 목록 가져오기
- 각 데이터베이스를 덤프하다
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 '**********************************************'
또한 다음과 같은 이점이 있습니다.
최근에 대용량 데이터베이스(압축되지 않은 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
'source' 카테고리의 다른 글
isset()와 !empty()를 모두 체크하는 이유 (0) | 2022.12.24 |
---|---|
Mac에 설치된 모든 Java 버전 보기 (0) | 2022.12.24 |
'ngModel'은 'input'의 알려진 속성이 아니므로 바인딩할 수 없습니다. (0) | 2022.12.24 |
MySQL 사용자에게 호스트 액세스 권한 재할당 (0) | 2022.12.24 |
NOW()를 datetime 데이터 유형의 기본값으로 설정하시겠습니까? (0) | 2022.12.24 |