programing

Mysql Dump를 사용하여 보기 백업

topblog 2023. 8. 31. 23:33
반응형

Mysql Dump를 사용하여 보기 백업

mysqdump로 보기만 백업하려고 합니다.

이것이 가능합니까?

만약 그렇다면, 어떻게?

참고: Ken의 답변은 제안된 편집에서 자체 답변으로 이동했습니다.

위의 변형을 사용한 전체 명령줄 예제입니다.

 mysql -u username INFORMATION_SCHEMA
  --skip-column-names --batch
  -e "select table_name from tables where table_type = 'VIEW'
      and table_schema = 'database'"
  | xargs mysqldump -u username database
  > views.sql

이렇게 하면 쿼리를 통해 모든 뷰 이름을 INFORMATION_SCHEMA 데이터베이스로 추출한 다음 xargs에 파이프를 연결하여 mysqldump 명령을 공식화합니다. 출력 xargs를 친숙하게 만들려면 --skip-column-names 및 --batch가 필요합니다.보기가 많은 경우 이 명령줄이 너무 길어질 수 있습니다. 이 경우 선택 항목에 필터를 추가할 수 있습니다(예: 지정된 문자로 시작하는 모든 보기 검색).

information_schema를 사용하여 여러 데이터베이스에 대한 보기를 백업할 수 있습니다.

mysql --skip-column-names --batch -e 'select CONCAT("DROP TABLE IF EXISTS ", TABLE_SCHEMA, ".", TABLE_NAME, "; CREATE OR REPLACE VIEW ", TABLE_SCHEMA, ".", TABLE_NAME, " AS ", VIEW_DEFINITION, "; ") table_name from information_schema.views'

데이터베이스(및 기타 설정)를 한 번만 지정할 수 있도록 Andomar의 훌륭한 답변을 수정했습니다.

#!/bin/bash -e
mysql --skip-column-names --batch -e \
"select table_name from information_schema.views \
 where table_schema = database()" $* |
xargs --max-args 1 mysqldump $*

저장합니다.mysql-dump-views.sh다음을 통해 전화합니다.

$ mysql-dump-views.sh -u user -ppassword databasename >dumpfile.sql

백업이란 데이터가 없는 정의를 의미하는 것으로 추정됩니다.

현재 mysqdump는 VIEW와 TABLE을 구분하지 않는 것 같습니다. 따라서 가장 좋은 방법은 명령줄에서 mysqdump로 VIEW를 명시적으로 지정하거나 mysqdump 이전에 동적으로 이 목록을 확인한 다음 이전과 같이 전달하는 것입니다.

다음 쿼리를 사용하여 특정 데이터베이스의 모든 VIEW를 가져올 수 있습니다.

SHOW FULL TABLES WHERE table_type='view';

이 질문에 대한 답변의 측면에서, 올리비버답변은 이를 직접적으로 수행하는 것이 가장 좋습니다.이에 대한 답변으로 종합적인 전체 백업 및 복원 솔루션으로 구축해 보겠습니다.

이 질문의 다른 답변과 몇 가지 다른 리소스의 도움을 받아 개발 서버의 데이터베이스를 요청 시 프로덕션 서버의 실시간 복사본으로 쉽게 교체할 수 있는 스크립트를 만들었습니다.모든 데이터베이스가 아닌 한 번에 하나의 데이터베이스에서 작동합니다.이를 위한 별도의 스크립트가 있지만, 기본적으로 선택한 몇 개의 데이터베이스를 제외한 모든 것을 삭제하고 다시 만들기 때문에 여기서 공유하는 것은 안전하지 않습니다. 사용자의 환경은 다양할 수 있습니다.

이 스크립트는 두 시스템 모두에서 루트 시스템과 MySQL 사용자가 서버 간에 암호 없이 SSH 작업을 수행한다고 가정하고 다음과 같은 MySQL 암호 파일 /root/mysqlroot.cnf를 사용합니다.

[client]
password=YourPasswordHere

파일: synctestdb.sh , 사용 편의성을 위해 선택적으로 /usr/sbin/synctestdb에 연결됨

Usage: synctestdb DBNAME DESTSERVER

프로덕션 서버에서 실행합니다.

여기 있습니다.

#!/bin/bash

if [ "${1}" != "" ] && [ "${1}" != "--help" ] && [ "${2}" != "" ] ; then

    DBNAME=${1}
    DESTSERVER=${2}
    BKDATE=$( date "+%Y-%m-%d" );
    SRCHOSTNAME=$( /bin/hostname )
    EXPORTPATH=/tmp
    EXPORTFILE=/tmp/${SRCHOSTNAME}_sql_${BKDATE}_devsync.sql
    CREDSFILE=/root/mysqlroot.cnf
    SSHUSER=root

    DBEXISTS=$( echo "SHOW DATABASES LIKE '${DBNAME}'" \
      | mysql --defaults-extra-file=${CREDSFILE} -NB INFORMATION_SCHEMA )

    if [ "${DBEXISTS}" == "${DBNAME}" ] ; then
        echo Preparing --ignore-tables parameters for all relevant views
        echo
        #build --ignore-table parameters list from list of all views in
        #relevant database - as mysqldump likes to recreate views as tables
        #we pair this with an export of the view definitions later below
        SKIPVIEWS=$(mysql --defaults-extra-file=${CREDSFILE} \
          -NB \
          -e "SELECT \
            CONCAT( '--ignore-table=', TABLE_SCHEMA, '.', TABLE_NAME ) AS q \
            FROM INFORMATION_SCHEMA.VIEWS \
            WHERE TABLE_SCHEMA = '${DBNAME}';" )

        if [ "$?" == "0" ] ; then

            echo Exporting database ${DBNAME}
            echo
            mysqldump --defaults-extra-file=${CREDSFILE} ${SKIPVIEWS}  \
              --add-locks --extended-insert --flush-privileges --no-autocommit \
              --routines --triggers --single-transaction --master-data=2 \
              --flush-logs --events --quick --databases ${DBNAME} > ${EXPORTFILE} \
              || echo -e "\n\nERROR: ${SRCHOSTNAME} failed to mysqldump ${DBNAME}"
            echo Exporting view definitions
            echo
            mysql --defaults-extra-file=${CREDSFILE} \
              --skip-column-names --batch \
              -e "SELECT \
                CONCAT( \
                'DROP TABLE IF EXISTS ', TABLE_SCHEMA, '.', TABLE_NAME, \
                '; CREATE OR REPLACE VIEW ', TABLE_SCHEMA, '.', TABLE_NAME, ' AS ', \
                VIEW_DEFINITION, '; ') AS TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS \
                WHERE TABLE_SCHEMA = '${DBNAME}';" >> ${EXPORTFILE} \
              || echo -e "\n\nERROR: ${SRCHOSTNAME} failed to mysqldump view definitions"
            echo Export complete, preparing to transfer export file and import
            echo
            STATUSMSG="SUCCESS: database ${DBNAME} synced from ${SRCHOSTNAME} to ${DESTSERVER}"
            scp \
              ${EXPORTFILE} \
              ${SSHUSER}@${DESTSERVER}:${EXPORTPATH}/ \
              || STATUSMSG="ERROR: Failed to SCP file to remote server ${DESTSERVER}"
            ssh ${SSHUSER}@${DESTSERVER} \
              "mysql --defaults-extra-file=${CREDSFILE} < ${EXPORTFILE}" \
              || STATUSMSG="ERROR: Failed to update remote server ${DESTSERVER}"
            ssh ${SSHUSER}@${DESTSERVER} \
              "rm ${EXPORTFILE}" \
              || STATUSMSG="ERROR: Failed to remove import file from remote server ${DESTSERVER}"
            rm ${EXPORTFILE}
            echo ${STATUSMSG}

        else
            echo "ERROR: could not obtain list of views from INFORMATION_SCHEMA"
        fi

    else
        echo "ERROR: specified database not found, or SQL credentials file not found"
    fi

else
    echo -e "Usage: synctestdb DBNAME DESTSERVER \nPlease only run this script from the live production server\n"
fi

현재까지는 작동하는 것으로 보이지만, 목적에 맞게 조정하는 것이 좋습니다.인증 정보 파일이 어디에 있든지 권한이 없는 사용자가 읽을 수 없도록 보안 액세스 권한으로 설정되어 있는지 확인하십시오.

보기를 제대로 내보내는 것이 어려워 보이므로 먼저 데이터베이스에 있는 유효한 보기의 정확한 이름을 가진 테이블이나 뷰를 삭제한 다음 모든 테이블을 가져오도록 올리바의 답변을 수정하여 테이블잘못 생성할 수 있습니다.그런 다음 테이블을 삭제하고 보기를 올바르게 정의합니다.

기본적으로 작동 방식은 다음과 같습니다.

  • 명령줄에서 지정한 데이터베이스의 존재 확인
  • MYSQLDUMP를 사용하여 덤프 파일 생성
  • 프로덕션에서 지정된 테스트 서버로 덤프 파일 SCP
  • SSH를 통해 지정된 테스트 서버에서 가져오기 명령 실행 및 출력 반환
  • 완료 후 두 서버에서 덤프 파일 제거
  • 대부분의 단계에서 합리적인 출력을 제공합니다.

INFORMATION_SCHEMA의 간단한 쿼리로는 재구성할 수 없는 뷰에 대한 많은 정보가 포함되어 있기 때문에 OP가 요청한 대로 mysqdump의 출력에 최대한 근접할 것입니다.

원본 데이터베이스에서 배포 보기 스크립트를 생성하는 방법은 다음과 같습니다.

SOURCEDB="my_source_db"
mysql $SOURCEDB --skip-column-names  -B -e \
"show full tables where table_type = 'view'" \
| awk '{print $1}' \
| xargs -I {} mysqldump $SOURCEDB {} > views.sql

이것에 대해 감사합니다 - 매우 유용합니다.

하지만 한 가지 문제는 - 아마도 다른 견해 등을 참조하는 약간 난해한 견해 집합을 가지고 있기 때문입니다.

"정의자" 사용자가 존재하고 대상 스키마에 대한 올바른 권한을 가지고 있어야 합니다. 그렇지 않으면 mysql은 정의가 불충분하기 때문에 다른 뷰를 참조하는 뷰를 생성하지 않습니다.

생성된 경우:

DEFINEER/*!50013 DEFINEER=<user>@<host> SECURITY */SQL 파일 */

--> 인확<user>@<host>대상 인스턴스에서 사용할 수 있습니다. 또는 이 문자열을 해당 사용자로 바꿉니다.

Thorstein 감사합니다.

언급URL : https://stackoverflow.com/questions/1658204/backing-up-views-with-mysql-dump

반응형