문제

이 질문에는 이미 답변이 있습니다.

MySQL에서 백업을 어떻게 수행합니까?

나는 "x"시간마다 mysqldump를 실행하는 것보다 더 나은 것이 있기를 바라고 있습니다.

매일 전체 백업을 수행한 다음 매시간 증분 백업을 수행하여 DB가 중단되면 최신 백업으로 복원할 수 있는 SQL Server와 같은 것이 있습니까?

DB 로그 같은 거, 로그가 죽지 않는 한 DB가 죽은 정확한 지점까지 복구할 수 있는 건가요?

또한 이러한 것들이 잠금에 어떤 영향을 미치나요?mysqldump를 수행하면 온라인 트랜잭션이 잠시 동안 잠길 것으로 예상됩니다.

도움이 되었습니까?

해결책

당신은보고 싶을 수도 있습니다 증분 백업.

다른 팁

mysqldump는 합리적인 접근 방식이지만 일부 엔진의 경우 덤프 기간 동안 테이블이 잠기므로 대규모 프로덕션 데이터 세트에 대한 가용성 문제가 있다는 점을 명심하십시오.

이에 대한 확실한 대안은 Maatkit의 mk-parallel-dump입니다(http://www.maatkit.org/) mysql 관리자라면 꼭 확인해야 할 내용입니다.이는 mysqldump를 사용하여 여러 테이블이나 데이터베이스를 병렬로 덤프하므로 덤프에 소요되는 총 시간이 줄어듭니다.

복제된 설정에서 실행 중인 경우(그리고 프로덕션에서 중요한 데이터에 MySQL을 사용하는 경우 그렇게 하지 않을 변명의 여지가 없습니다) 전용 복제 슬레이브에서 덤프를 가져오면 잠금 문제를 방지할 수 있습니다. 문제를 일으키는.

최소한 Linux에서 다음으로 확실한 대안은 LVM 스냅샷을 사용하는 것입니다.테이블을 잠그고, 파일 시스템의 스냅샷을 찍은 다음, 테이블을 다시 잠금 해제할 수 있습니다.그런 다음 해당 스냅샷의 마운트를 사용하여 추가 MySQL을 시작하고 거기에서 덤프합니다.이 접근 방식은 다음과 같습니다. http://www.mysqlperformanceblog.com/2006/08/21/using-lvm-for-mysql-backup-and-replication-setup/

이제 나는 이 제품의 마케팅 담당자처럼 들리기 시작했습니다.나는 그걸로 질문에 대답했어 여기, 그런 다음 다시 다른 사람에게 대답했습니다. 여기.

간단히 말해서, sqlyog (귀하의 경우 기업)를 사용해보십시오. 웹요그 귀하의 모든 MySQL 요구 사항에 대해.뿐만 아니라 백업 예약, 그러나 또한 일정 동기화 따라서 실제로 데이터베이스를 원격 서버에 복제할 수 있습니다.

무료 커뮤니티 에디션과 엔터프라이즈 에디션이 있습니다.나는 당신에게 나중에 추천하지만 comm 버전으로 먼저 시작하는 것도 추천합니다. 당신이 그것을 얼마나 좋아하는지 확인.

나는 mysqlhotcopy를 사용한다. 로컬 MySQL 데이터베이스 및 테이블을 위한 빠른 온라인 핫 백업 유틸리티.나는 그것에 매우 만족합니다.

Percona 사람들은 innobackup에 대한 오픈 소스 대안을 만들었습니다 ...

엑스트라백업

https://launchpad.net/percona-xtrabackup/

XtraDB에 대한 이 기사를 읽어보세요.http://www.linux-mag.com/cache/7356/1.html

다음을 사용하여 현재 오프라인 백업 구성표를 보완할 수 있습니다. MySQL 복제.

그런 다음 하드웨어 오류가 발생하면 컴퓨터를 교체하면 됩니다.오류를 신속하게 파악하면 사용자는 가동 중지 시간이나 데이터 손실을 인지하지 못할 것입니다.

나는 mysql 데이터베이스를 tar.gz 파일에 덤프하고 gpg를 사용하여 암호화한 후 메일 계정(Google Mail, 그러나 실제로는 관련이 없음)으로 보내는 간단한 스크립트를 사용합니다.

스크립트는 기본적으로 다음 명령을 실행하고 출력 파일을 이메일로 보내는 Python 스크립트입니다.

mysqldump -u theuser -p mypassword thedatabase | gzip -9 - | gpg -e -r 12345 -r 23456 > 2008_01_02.tar.gz.gpg

전체 백업입니다.또한 파일을 tar/gzips/암호화하는 웹 백업 부분도 있습니다.상당히 작은 사이트이므로 웹 백업이 20MB보다 훨씬 작으므로 문제 없이 GMail 계정으로 보낼 수 있습니다(MySQL 덤프는 약 300KB로 압축되어 매우 작습니다).이는 매우 기본적이며 확장이 잘 되지 않습니다.cron을 사용하여 일주일에 한 번 실행합니다.

답변에 긴 스크립트를 어떻게 넣어야 할지 잘 모르겠어서 그냥 코드 블록으로 밀어넣겠습니다.

#!/usr/bin/env python
#encoding:utf-8
#
# Creates a GPG encrypted web and database backups, and emails it

import os, sys, time, commands

################################################
### Config

DATE = time.strftime("%Y-%m-%d_%H-%M")

# MySQL login
SQL_USER = "mysqluser"
SQL_PASS = "mysqlpassword"
SQL_DB = "databasename"

# Email addresses
BACKUP_EMAIL=["email1@example.com", "email2@example.com"] # Array of email(s)
FROM_EMAIL = "root@myserver.com" # Only one email

# Temp backup locations
DB_BACKUP="/home/backupuser/db_backup/mysite_db-%(date)s.sql.gz.gpg" % {'date':DATE}
WEB_BACKUP="/home/backupuser/web_backup/mysite_web-%(date)s.tar.gz.gpg" % {'date':DATE}

# Email subjects
DB_EMAIL_SUBJECT="%(date)s/db/mysite" % {'date':DATE}
WEB_EMAIL_SUBJECT="%(date)s/web/mysite" % {'date':DATE}

GPG_RECP = ["MrAdmin","MrOtherAdmin"]
### end Config
################################################

################################################
### Process config
GPG_RECP = " ".join(["-r %s" % (x) for x in GPG_RECP]) # Format GPG_RECP as arg

sql_backup_command = "mysqldump -u %(SQL_USER)s -p%(SQL_PASS)s %(SQL_DB)s | gzip -9 - | gpg -e %(GPG_RECP)s > %(DB_BACKUP)s" % {
    'GPG_RECP':GPG_RECP,
    'DB_BACKUP':DB_BACKUP,
    'SQL_USER':SQL_USER,
    'SQL_PASS':SQL_PASS,
    'SQL_DB':SQL_DB
}

web_backup_command = "cd /var/www/; tar -c mysite.org/ | gzip -9 | gpg -e %(GPG_RECP)s > %(WEB_BACKUP)s" % {
    'GPG_RECP':GPG_RECP,
    'WEB_BACKUP':WEB_BACKUP,
}
# end Process config
################################################

################################################
### Main application
def main():
        """Main backup function"""
        print "Backing commencing at %s" % (DATE)

        # Run commands
        print "Creating db backup..."
        sql_status,sql_cmd_out = commands.getstatusoutput(sql_backup_command)
        if sql_status == 0:
                db_file_size = round(float( os.stat(DB_BACKUP)[6]  ) /1024/1024, 2) # Get file-size in MB
                print "..successful (%.2fMB)" % (db_file_size)
                try:
                    send_mail(
                        send_from = FROM_EMAIL,
                        send_to   = BACKUP_EMAIL,
                        subject   = DB_EMAIL_SUBJECT,
                        text      = "Database backup",
                        files     = [DB_BACKUP],
                        server    = "localhost"
                    )
                    print "Sending db backup successful"
                except Exception,errormsg:
                    print "Sending db backup FAILED. Error was:",errormsg
                #end try

                # Remove backup file
                print "Removing db backup..."
                try:
                        os.remove(DB_BACKUP)
                        print "...successful"
                except Exception, errormsg:
                        print "...FAILED. Error was: %s" % (errormsg)
                #end try
        else:
                print "Creating db backup FAILED. Output was:", sql_cmd_out
        #end if sql_status

        print "Creating web backup..."
        web_status,web_cmd_out = commands.getstatusoutput(web_backup_command)
        if web_status == 0:
                web_file_size = round(float( os.stat(WEB_BACKUP)[6]  ) /1024/1024, 2) # File size in MB
                print "..successful (%.2fMB)" % (web_file_size)
                try:
                    send_mail(
                        send_from = FROM_EMAIL,
                        send_to   = BACKUP_EMAIL,
                        subject   = WEB_EMAIL_SUBJECT,
                        text      = "Website backup",
                        files     = [WEB_BACKUP],
                        server    = "localhost"
                    )
                    print "Sending web backup successful"
                except Exception,errormsg:
                    print "Sending web backup FAIELD. Error was: %s" % (errormsg)
                #end try

                # Remove backup file
                print "Removing web backup..."
                try:
                        os.remove(WEB_BACKUP)
                        print "...successful"
                except Exception, errormsg:
                        print "...FAILED. Error was: %s" % (errormsg)
                #end try
        else:
                print "Creating web backup FAILED. Output was:", web_cmd_out
        #end if web_status
#end main
################################################

################################################
# Send email function

# needed email libs..
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders

def send_mail(send_from, send_to, subject, text, files=[], server="localhost"):
        assert type(send_to)==list
        assert type(files)==list

        msg = MIMEMultipart()
        msg['From'] = send_from
        msg['To'] = COMMASPACE.join(send_to)
        msg['Date'] = formatdate(localtime=True)
        msg['Subject'] = subject

        msg.attach( MIMEText(text) )

        for f in files:
                part = MIMEBase('application', "octet-stream")
                try:
                    part.set_payload( open(f,"rb").read() )
                except Exception, errormsg:
                    raise IOError("File not found: %s"%(errormsg))
                Encoders.encode_base64(part)
                part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f))
                msg.attach(part)
    #end for f

        smtp = smtplib.SMTP(server)
        smtp.sendmail(send_from, send_to, msg.as_string())
        smtp.close()
#end send_mail
################################################

if __name__ == '__main__':
        main()

"--single-transaction --skip-lock-tables" 옵션을 사용하면 mysqldump를 통해 잠금(다운타임) 없이 InnoDB 데이터베이스/테이블의 전체 덤프를 만들 수 있습니다.주간 스냅샷 + 일별/시간별 스냅샷 생성에 적합 바이너리 로그 증분 (#바이너리 로그를 사용하여 증분 백업 활성화)

@제이크,

정보 주셔서 감사합니다.이제는 상용버전에만 백업 기능이 있는 것 같습니다.

적절한 백업을 수행하기 위해 MySQL에 내장된 것이 없습니까?

공식 MySQL 페이지에서는 "업데이트되지 않는 한 파일을 복사해도 됩니다"와 같은 내용을 권장합니다...

mysql 데이터베이스 폴더의 직접 백업의 문제점은 백업 중에 쓰기 잠금을 수행하지 않는 한 백업이 반드시 일관되지는 않는다는 것입니다.

모든 데이터베이스를 반복하여 각각 백업 폴더에 mysqldump 및 gzip을 수행한 다음 해당 폴더를 테이프에 백업하는 스크립트를 실행합니다.

그러나 이는 다음과 같은 것이 없다는 것을 의미합니다. 증분 야간 덤프는 전체 덤프이기 때문에 백업합니다.하지만 저는 이것이 좋은 일이 될 수 있다고 주장합니다. 전체 백업 이는 증분에서 복원하는 것보다 훨씬 더 빠른 프로세스입니다. 테이프에 백업하는 경우 전체 복원을 수행하기 전에 여러 개의 테이프를 수집해야 할 가능성이 높습니다.

어떤 경우든 어떤 백업 계획을 사용하든 시험 복원을 수행하여 작동하는지 확인하고 시간이 얼마나 걸릴지, 수행해야 할 단계가 정확히 무엇인지 파악하십시오.

mysql 서버의 증분 또는 연속 백업을 실행하는 올바른 방법은 바이너리 로그를 사용하는 것입니다.

우선 모든 테이블을 잠그거나 서버를 다운시키세요.mysql 덤프를 사용하여 백업을 만들거나 데이터 디렉터리를 복사하세요.이 작업은 한 번만 수행하거나 전체 백업을 원할 때 언제든지 수행하면 됩니다.

서버 백업을 시작하기 전에 바이너리 로깅이 활성화되어 있는지 확인하세요.

증분 백업을 수행하려면 서버에 로그인하고 FLUSH LOGS 명령을 실행하십시오.그런 다음 가장 최근에 닫힌 바이너리 로그 파일을 백업하십시오.

innodb 테이블이 모두 있는 경우 --single-transaction 옵션과 함께 inno hot backup(무료 아님) 또는 mysqldump를 사용하는 것이 더 간단합니다(트랜잭션을 처리할 메모리가 많이 있는 것이 좋습니다).

바이너리 로그는 아마도 증분 백업을 수행하는 올바른 방법일 것입니다. 그러나 영구 저장을 위한 바이너리 파일 형식을 신뢰하지 않는 경우 증분 백업을 수행하는 ASCII 방법이 있습니다.

mysqldump는 나쁜 형식이 아닙니다. 주된 문제는 테이블을 하나의 큰 줄로 출력한다는 것입니다.다음의 간단한 sed는 레코드 경계를 따라 출력을 분할합니다.

mysqldump -opt -p | sed -e "s/, (/, n (/g"> database.dump

결과 파일은 매우 유사하며 표준 SVN 저장소에 꽤 성공적으로 보관해 왔습니다.또한 마지막 버전이 중단되어 지난 주 버전이 필요한 경우 백업 기록을 유지할 수 있습니다.

이것은 Linux 쉘을 위한 매우 견고한 솔루션입니다.나는 수년 동안 그것을 사용해 왔습니다.

http://sourceforge.net/projects/automysqlbackup/

  • 롤링 백업을 수행합니까?매일, 매월, 매년
  • 다양한 옵션

@다니엘,

여전히 관심이 있으시면 다음에서 공유하는 새로운 (나에게 새로운) 솔루션이 있습니다. 폴 갤브레이스, innodb 테이블의 온라인 백업을 허용하는 도구입니다. ibbackup 바울을 인용한 신탁에서,

와 함께 사용하는 경우 이노백업, 백업 중에 가동 중지 시간없이 야간 백업을 만드는 데 큰 도움이되었습니다.

자세한 내용은에서 확인할 수 있습니다. 폴의 블로그

트랜잭션 롤백에 대해 이야기하는 것 같습니다.

그렇다면 필요한 측면에서 볼 때, 모든 기록 쿼리가 포함된 로그가 있다면 이미 백업이 되지 않았나요?기본적으로 DB 로그에 있는 모든 정보의 중복 복사본인 증분 백업이 필요한 이유는 무엇입니까?

그렇다면 그냥 mysqldump를 사용하고 가끔씩 백업을 해보는 것은 어떨까요?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top