programing

별도의 파일에 있는 db가 있는 mysqdump

telebox 2023. 9. 4. 19:44
반응형

별도의 파일에 있는 db가 있는 mysqdump

하나의 SQL에 모든 데이터베이스를 덤프하는 대신 모든 데이터베이스를 각각의 이름으로 백업하는 단일 줄 명령어를 작성하고 있습니다.

예: db1은 db1.sql에 저장되고 db2는 db2.sql에 저장됩니다.

지금까지 모든 데이터베이스를 검색하기 위해 다음 명령을 수집했습니다.

mysql -uuname -ppwd -e 'show databases' | grep -v 'Database'

나는 그것을 어색하게 피울 계획입니다.

awk '{mysqldump -uuname -ppwd $1 > $1.sql}'

하지만 그것은 효과가 없습니다.

저는 욕을 처음 해봐서 제 생각이 틀릴 수도 있어요.
DB를 각자의 이름으로 내보내려면 어떻게 해야 합니까?

업데이트:
좋아요, 마침내 아래 힌트에서 작동할 수 있도록 해야 합니다.
대본입니다.

# replace [] with your own config
# replace own dir to save
# echo doesn't work. hmm...

mysql -u[uname] -p'[pwd]' -e "show databases" \
| grep -Ev 'Database|information_schema' \
| while read dbname; \
do \
echo 'Dumping $dbname' \
mysqldump -u[uanme] -p'[pwd]' $dbname > ~/db_backup/$dbname.sql;\
done

하지만 의 반향 부분은 작동하지 않습니다.

mysql -uroot -N -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert --some-other-options "$dbname" > "$dbname".sql; done

데이터베이스별로 백업을 생성하는 것이 훨씬 효율적입니다.한 번 필요하면 쉽게 복원할 수 있을 뿐만 아니라 테이블 하나가 손상되거나 손상된 경우 전체 데이터베이스를 백업할 수 있다는 사실도 경험했습니다.또한 데이터베이스별로 백업을 생성하면 해당 데이터베이스에 대한 백업만 중단되고 나머지는 여전히 유효합니다.

mysql 데이터베이스를 백업하기 위해 만든 라인은 다음과 같습니다.

mysql -s -r -u bupuser -pSecret -e 'show databases' | while read db; do mysqldump -u bupuser -pSecret $db -r /var/db-bup/${db}.sql; [[ $? -eq 0 ]] && gzip /var/db-bup/${db}.sql; done

암호가 '비밀'(변경!)인 새 읽기 전용 mysql 사용자 'bupuser'를 만드는 것이 가장 좋습니다.먼저 데이터베이스 목록을 검색합니다.그런 다음 및 를 루프하여 각 데이터베이스에 대해 dump.sql 파일을 /var/db-bup에 생성합니다(변경할 수 있음).또한 오류가 발생하지 않을 때만 파일을 gzip하여 스토리지를 획기적으로 절약할 수 있습니다.일부 데이터베이스에 오류가 발생하면 .sql.qz 파일이 아닌 .sql 파일이 표시됩니다.

다음과 같은 간단한 스크립트를 제공합니다.

  • -> dump all DBA ->SCHEMA_NAME.sql.gz
  • [syscommit/sshd_foreign_key_sshd]를 사용하여 가져오기 속도를 높입니다.
  • 기본 스키마 제외

파일: Dump_all.sh

사용 방법:
>./.sh -> DB를 덤프합니다.
SCHMA_NAME DB./Dump_all.sh SCHMA_NAME -> SCHMA_NAME DB를 .

#!/bin/bash
MYSQL_USER="root"
MYSQL_PASS="YOUR_PASS"

echo "-- START --"

echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > tmp_sqlhead.sql
echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;" > tmp_sqlend.sql

if [ -z "$1" ]
  then
    echo "-- Dumping all DB ..."
    for I in $(mysql -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' -s --skip-column-names); 
    do
      if [ "$I" = information_schema ] || [ "$I" =  mysql ] || [ "$I" =  phpmyadmin ] || [ "$I" =  performance_schema ]  # exclude this DB
      then
         echo "-- Skip $I ..."
       continue
      fi
      echo "-- Dumping $I ..."
      # Pipe compress and concat the head/end with the stoutput of mysqlump ( '-' cat argument)
      mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I | cat tmp_sqlhead.sql - tmp_sqlend.sql | gzip -fc > "$I.sql.gz" 
    done

else
      I=$1;
      echo "-- Dumping $I ..."
      # Pipe compress and concat the head/end with the stoutput of mysqlump ( '-' cat argument)
      mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I | cat tmp_sqlhead.sql - tmp_sqlend.sql | gzip -fc > "$I.sql.gz" 
fi

# remove tmp files
rm tmp_sqlhead.sql
rm tmp_sqlend.sql

echo "-- FINISH --"

이것은 제가 사용하는 것이고, 매우 간단하고 저에게 잘 맞습니다.

mysql --skip-column-names -u root -p -e 'show databases' | while read dbname; do mysqldump --lock-all-tables -u root -p "$dbname"> "$(date +%Y%m%d)-$dbname".sql; done

압축 옵션 포함:

mysql --skip-column-names -u root -p -e 'show databases' | while read dbname; do mysqldump --lock-all-tables -u root -p "$dbname" | gzip> /tmp/"$(date +%Y%m%d)-$dbname".sql.gz; done

명령에 비밀번호를 추가하지 않은 경우, 비밀번호에 데이터베이스의 총 개수를 더한 값을 입력해야 합니다.

이것이 저에게 효과가 있었던 것입니다.

mysql -s -r -uroot -e 'show databases' -N | while read dbname; do 
    mysqldump -uroot --complete-insert --single-transaction "$dbname" > "$dbname".sql; 
done

단 몇 초 만에 효과를 본 가장 빠르고 간단한 해결책이 있습니다.

  1. FTP 클라이언트 앱 또는 Winscp 앱을 사용하여 FTP를 통해 서버에 로그인합니다.
  2. https://gist.github.com/daniel-werner/5ab30d2e5c566adaad3022f4da9e141d, 에서 이 스크립트를 다운로드하여 압축을 풀고 .sh 파일을 서버의 /home 디렉토리에 업로드합니다.
  3. sudo 권한이 있는 계정으로 OS(Linux)에 SSH하고 홈 디렉토리에 CD를 저장합니다.
  4. chmod +x dump-all 데이터베이스를 사용하여 스크립트를 실행할 수 있도록 합니다.sh 명령
  5. ./dump-all-databases.sh -u root -o /var/www/db_message_folder...를 사용하여 명령을 실행합니다.참고: 루트를 데이터베이스 사용자 이름으로 바꿉니다.
  6. Enter 키를 눌러 스크립트를 실행합니다.
  7. mysql - user 비밀번호를 입력합니다. 즉, 데이터베이스에 액세스할 수 있는 데이터베이스 사용자가 user12인 경우 다음 비밀번호 프롬프트에서 비밀번호를 입력합니다.
  8. 데이터베이스가 예상대로 덤프되었는지 확인하기 위해 백업 디렉토리를 탐색합니다.

기타 참조 및 신용: https://dev.to/daniel_werner/how-to-dump-all-mysql-databases-into-separate-files-4okc

질문에 대한 답변은 아니지만 AutoMy를 살펴보십시오.휠을 다시 발명하는 대신 소스포지에서 SQL 백업 프로젝트를 수행합니다.원하는 기능을 제공하며 압축, 암호화, 순환 및 전자 메일 알림을 비롯한 수많은 추가 기능을 제공합니다.제가 얼마 전에 사용한 적이 있는데 정말 잘 작동했습니다.

괜찮아 보입니다.현재 테스트하지 않고 찾을 수 있는 유일한 것은 Show Tables 에 세미콜론이 없다는 것입니다.

AutoMy에 사용할 수 있는 패키지를 찾는 동안@Jeshurun이 제안한 SQLBackup 프로젝트 네덜란드를 우연히 발견했습니다.

(저는 네덜란드 남부의 벨기에에 살고 있으며, 때때로 - 또는 더 나은 지역들 - "홀란드"라고 지칭됨)이라는 이름에 흥미를 느껴, 저는 그것을 확인하기로 결정했습니다.아마도 그것은 당신에게도 도움이 될 것입니다.

언급URL : https://stackoverflow.com/questions/10867520/mysqldump-with-db-in-a-separate-file

반응형