是否有类似SQL Server的功能,您可以每天进行一次完整备份,然后每小时进行一次增量备份,因此,如果数据库死了,则可以还原到最新的备份?
类似于数据库日志," /> 是否有类似SQL Server的功能,您可以每天进行一次完整备份,然后每小时进行一次增量备份,因此,如果数据库死了,则可以还原到最新的备份?
类似于数据库日志," /> 是否有类似SQL Server的功能,您可以每天进行一次完整备份,然后每小时进行一次增量备份,因此,如果数据库死了,则可以还原到最新的备份?
类似于数据库日志," />

首页 / 知识

如何在MySQL中进行备份?

2023-04-14 08:55:00

如何在MySQL中进行备份?

How do I do backups in MySQL?

本问题已经有最佳答案,请猛点这里访问。

如何在MySQL中进行备份?

我希望有比每隔" x"小时运行一次mysqldump更好的东西。

是否有类似SQL Server的功能,您可以每天进行一次完整备份,然后每小时进行一次增量备份,因此,如果数据库死了,则可以还原到最新的备份?

类似于数据库日志,只要日志不会消失,您就可以恢复到数据库死亡的确切位置?

此外,这些东西如何影响锁定?
如果我执行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/


现在,我开始听起来像是该产品的市场营销人员。我在这里回答了一个问题,然后在这里再次回答了另一个问题。

简而言之,请尝试从webyog尝试sqlyog(针对您的企业)来满足所有mysql要求。它不仅可以安排备份,还可以安排同步,因此您实际上可以将数据库复制到远程服务器。

它具有免费的社区版和企业版。我向您推荐后者,尽管我也建议您从comm版本开始,并首先了解您的喜好。


Percona伙计们开源了innobackup的替代品...

Xtrabackup

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

阅读有关XtraDB的文章
http://www.linux-mag.com/cache/7356/1.html


我使用mysqlhotcopy,这是一种用于本地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

这是整个备份。它还具有Web备份部分,仅tar / gzips /加密文件。这是一个相当小的站点,因此Web备份少于20MB,因此可以毫无问题地发送到GMail帐户(MySQL转储很小,压缩后约为300KB)。这是非常基础的,无法很好地扩展。我每周使用cron运行一次。

我不太确定我们应该如何在回答中加入冗长的脚本,因此我只将其作为代码块使用。.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#!/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()

您可能想用MySQL复制来补充当前的脱机备份方案。

然后,如果您遇到硬件故障,则可以交换计算机。如果您迅速发现故障,您的用户甚至不会注意到任何停机时间或数据丢失。


您可以通过带有" --single-transaction --skip-lock-tables"选项的mysqldump进行InnoDB数据库/表的完全转储,而无需锁定(停机)。对于每周/每天/每小时二进制日志增量制作快照非常有效(#使用二进制日志启用增量备份)。


这是一个非常可靠的Linux shell解决方案。我已经使用了多年了:

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

  • 是否进行滚动备份:每天,每月,每年
  • 很多选择

二进制日志可能是进行增量备份的正确方法,但是如果您不信任二进制文件格式的永久存储,则可以使用ASCII方式进行增量备份。

mysqldump的格式不是很坏,主要问题是它把一张表输出为一行。以下琐碎的sed将其输出沿记录边界分割:

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

生成的文件对diff非常友好,并且我已经相当成功地将它们保存在标准SVN存储库中。如果发现上一个版本令人讨厌并且需要上周的版本,那么这也可以使您保留备份的历史记录。


运行mysql服务器的增量或连续备份的正确方法是使用二进制日志。

首先,锁定所有表或关闭服务器。使用mysql dump进行备份,或仅复制数据目录。您只需要执行一次此操作,或者在任何时候想要完整备份。

在备份服务器之前,请确保已启用二进制日志记录。

要进行增量备份,请登录服务器并发出FLUSH LOGS命令。然后备份最近关闭的二进制日志文件。

如果拥有所有innodb表,则使用带有--single-transaction选项的inno热备份(非免费)或mysqldump更为简单(您最好有很多内存来处理事务)。 >


直接备份mysql数据库文件夹的问题是,备份不一定是一致的,除非您在备份过程中进行了写锁定。

我运行一个遍历所有数据库的脚本,在每个数据库上执行mysqldump和gzip到备份文件夹,然后将该文件夹备份到磁带。

但是,这意味着不存在增量备份之类的事情,因为夜间转储是完整的转储。但是我认为这可能是一件好事,因为从完整备份还原将比从增量备份还原要快得多。而且,如果要备份到磁带,则可能意味着需要在收集磁带之前先收集许多磁带。可以进行完全还原。

在任何情况下,无论采用哪种备份计划,请务必进行一次试还原以确保其有效,并了解可能需要多长时间以及确切地需要执行哪些步骤。


@Jake,

感谢您的信息。
现在,看起来只有商业版本具有备份功能。

MySQL内置了什么功能来进行像样的备份吗?

MySQL官方页面甚至建议诸如"好吧,只要没有更新就可以复制文件"之类的东西。


听起来像您在谈论事务回滚。

因此就您的需求而言,如果您的日志包含所有历史查询,那么这是否已经是备份?为什么需要增量备份,它基本上是数据库日志中所有信息的冗余副本?

如果是这样,为什么不只使用mysqldump并每隔一段时间进行一次备份?


@Daniel,

如果您仍然感兴趣,可以使用Paul Galbraith共享的一种新的(对我来说是新的)解决方案,该工具允许从oracle在线备份名为ibbackup的innodb表,并引用Paul,

when used in conjunction with
innobackup, has worked great in
creating a nightly backup, with no
downtime during the backup

更多细节可以在Paul的博客中找到


运行备份数据库增量备份

最新内容

相关内容

猜你喜欢