拷贝数据库步骤详解,让你轻松备份数据! (怎么拷贝数据库)

随着互联网的飞速发展,越来越多的数据需要被存储下来。而对于一个企业来说,数据备份显得尤为重要。因此,如何进行备份数据,使资料得到安全保障,又变得尤为重要了。

在进行备份工作的时候,光备份文件是不够的,因为数据库中可能还有一些非常重要的有关数据库结构的信息,这些信息的丢失会对后续的数据处理工作产生很大影响。因此,备份数据库是一个必要的措施,那么如何备份数据库呢?下面笔者就为您详细介绍一下拷贝数据库的步骤。

一、备份之前的一些准备工作

在进行数据库备份之前,需要对数据库进行一些准备工作,包括以下几点:

1.备份的数据库必须是关闭状态,否则会造成备份文件不完整。

2.备份文件先前必须不存在,否则会覆盖原来的数据库文件,也会造成备份文件不完整。

3.备份文件的命名应该明确,例如:2023年10月20日备份文件,文件名为“bak20231020.dmp”。

二、拷贝数据库步骤详解

1.打开cmd命令行窗口。在cmd命令行窗口中,输入以下的命令:

exp 用户名/密码@数据库名 file=d:\bak20231020.dmp

其中,“用户名”指的是要备份的数据库的用户名,“密码”指的是要备份的数据库的密码,“数据库名”指的是要备份的数据库的名称,“file=d:\bak20231020.dmp”指的是备份的文件,需要注意的是备份的文件路径更好在非系统目录下,不然会造成文件找不到的情况。

2.执行上述命令后,会出现以下提示信息:

Export: Release 11.2.0.0.0 – Production on Fri Oct 19 11:33:20 2023

Copyright (c) 1982, 2023, Oracle and/or its affiliates. All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options

Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set

server uses WE8MSWIN1252 character set (possible charset conversion) About to export specified users …

. exporting pre-schema procedural objects and actions

. exporting foreign function library names for user

. exporting PUBLIC type synonyms

. exporting private type synonyms

. exporting object type definitions for user

About to export user’s data …

. exporting estimates

. exporting partitions

. exporting tables

……

导出过程中,我们需要耐心等待,不要关闭命令行窗口。当输出以下信息时,就表示备份完成:

. . exported “SCOTT”.”DEPT” 5.343 KB 4 rows

. . exported “SCOTT”.”EMP” 12.94 KB 14 rows

. . exported “SCOTT”.”SALGRADE” 5.492 KB 5 rows

Export terminated successfully without warnings.

3.备份文件拷贝至其它存储介质

备份文件已经制作完成,但是如果只是保存在原有计算机上,仍旧存在数据丢失的可能。所以更好的做法是将备份文件拷贝到其他介质上,比如移动硬盘或者光盘等等。

拷贝的具体方法可根据您的需求来决定,我们可以利用Windows的Cmd命令,也可以通过图形化的拷贝方法将备份文件拷贝到其他存储介质上。

备份数据虽然看起来是一项简单的工作,但是合理的备份数据、正确的备份方法以及规范的备份流程,才能使我们的数据储存得更加有保障。本篇文章详细介绍了如何通过拷贝数据库的方式来实现数据备份的目的,相信读者通过学习之后,已经掌握了正确的备份方式,能够更加有效地保护数据的安全。

相关问题拓展阅读:

现在我在学习MySQL,问问怎么复制粘贴数据库

这宴搭老得看你的数据表是什么存储引擎,

新建的数据表默认是InnoDB

数据表的存储引擎是可以更改的

随便进入一张表,选择操作,里面有存储引擎可以修改,你想复制表就可以将存储引擎修改成

myisam,

然后找到数据库的data目录复制好后,存储引擎再改枝闭成你需要的类型

phpmyadmin新建表时存储引擎

phpmyadmin修改存储引晌升擎

每当我们讨论一项(新的)领域技术的时候,更好的方式通常是首先抛出一些问题,这些问题大致分为三类:

诶?这项技术又是什么玩意(What)?

这项技术为什么会存在?我们已经有那么多解决方案(Method)了,我们为什么要用它(Why)?

如果这项技术那么好且我们正好有场景可以用到这项技术,且能使我们的系统得到很乐观的优化,那么我们怎么用呢(How)?

大概已经有同学觉得这些问题很熟悉了,是的,这就是黄金全法则提出的三个问题,对于每种新鲜事物我们首先基于这三个问题去了解,更有利于弄清楚事情的本质,端正态度去了解,而不是因为新,因为大家都说好,才要去了解……。说了那么多前奏,我们可以开始了,今天我们就带着黄金圈法则提出的三个问题去看看MySQL数据库复制这项领域技术,然后再结合实际应用扩展一些问题,本文也仅仅是结合自己了解的皮毛以抛砖引玉的态度和大家一起分享。

WHAT?

MySQL复制使得一台MySQL数据库服务器的数据被拷贝到其他一台或者多台数据库服务器,前者通常被叫做Master,后者通常被叫做Slave。

MySQL复制示意图

复制的结果是集群(Cluster)中的所有数据库服务器得到的数据理论上都是一样的,都是同一份数据,只是有多个copy。MySQL默认内建的复制策略是异步的,基于不同的配置,Slave不一定要一直和Master保持连接不断的复制或等待复制,我们指定复制所有的数据库,一部分数据库,甚至是某个数据库的某部分的表。

MySQL复制支持多种不同的复制策略,包括同步、半同步、异步和延迟策略等。

同步策略:Master要等待所有Slave应答之后才会提交(MySql对DB操作的提交通常是先对操作事件进行二进制日志文件写入然后再进行提交)。

半同步策略:Master等待至少一个Slave应答就可以提交。

异步策略:Master不需要等待Slave应答就可以提交。

延迟策略:Slave要至少落后Master指定的时间。

MySQL复制同时支持多种不同的复制模式:

基于语句的复制,Statement Based Replication(SBR)。

基于行的复制Row Based Replication(RBR)。

混合复制(Mixed)。

WHY?

这个问题其实也就是MySQL复制有什么好处,我们可以将复制的好处归结于下面几类:

性能方面:MySQL复制是一种Scale-out方案,也即“水平扩展”,将原来的单点负载扩散到多台Slave机器中去,从而提高总体的服务性能。在这种方式下,所有的写操作,当然包括UPDATE操作,都要发生在Master服务器上。读操作发生在一台或者帆桥厅多台Slave机器上。这种模型可以在一定程度上提高总体的服务性能,Master服务器专注于写和更新消悔操作,Slave服务器专注于读操作,我们同时可以通过增加Slave服务器的数量来提高读服务的性能。

防腐化:由于数据被复制到了Slave,Slave可以暂停复制进程,进行数据备份,因此可以防止数据腐化。

故障恢复:同时多台Slave如果有一台Slave挂掉之后我们还可以从其他Slave读取,如果配置了主从切换的话,当Master挂掉之后我们还可以选择一台Slave作为Master继续提供写服务,这大大增加了应用的可靠性态隐。

数据分析:实时数据可以存储在Master,而数据分析可以从Slave读取,这样不会影响Master的性能。

HOW?

这里我们只介绍一下MySQL的复制是如何工作的,至于配置,网上也有很多相关的介绍,读者具体应用的时候可以再去查阅。我们拿最常用的基于二进制文件的复制来看看。

MySQL复制工作示意图

请点击输入图片描述

请点击输入图片描述

MySQL的复制过程大概如下:

首先,主库在每次准备提交事务完成数据更新操作之前都会将数据更改操作记录到二进制日志中,这些日志是以二进制的方式记录数据更改的事件。值得一提的是二进制日志中记录的顺序实际上是事务的提交顺序,而非SQL执行语句的顺序。在记录二进制日志之后,主库会告诉存储引擎事务可以提交了。

然后,备库会启动一个IO线程,之所以叫做IO线程是因为这个线程专门做IO相关的工作,包括和主库建立连接,然后在主库上启动一个特殊的二进制转储线程,这个转储线程会不断的读取二进制日志中的事件,发送给备库的IO线程,备库的IO线程会将事件记录到中继日志中。

备库会有一个叫做SQL的线程被开启,这个线程做的事情是读取中继日志中的DB操作事件在备库执行,从而实现数据更新。

总的来说,在发生复制的主库服务器和备库服务器中,一共有三个线程在工作。

上面我们已经大概了解的什么是复制?为什么要复制?如何复制?这三个问题了,接下来我们基于上面的介绍,提出一些实际应用可能会发生的问题来思考如何解决。博主自问自答的方式-。-

问答环节

问题一:通过复制模型虽然读能力可以通过扩展slave机器来达到提高,而写能力却不能,如果写达到瓶颈我们应该怎么做呢?

答:我们首先会得出结论,这种复制模型对于写少读多型应用是非常有优势的,其次,当遇到这种问题的时候我们可以对数据库进行分库操作,所谓分库,就是将业务相关性比较大的表放在同一个数据库中,例如之前数据库有A,B,C,D四张表,A表和B表关系比较大,而C表和D表关系比较大,这样我们把C表和D表分离出去成为一个单独的数据库,通过这种方式,我们可以将原有的单点写变成双点写或多点些,从而降低原有主库的写负载。

问题二:因为复制是有延迟的,肯定会发生主库写了,但是从库还没有读到的情况,遇到这种问题怎么办?

答:MySQL支持不同的复制策略,基于不同的复制策略达到的效果也是不一样的,如果是异步复制,MySQL不能保证从库立马能够读到主库实时写入的数据,这个时候我们要权衡选择不同复制策略的利弊来进行取舍。所谓利弊,就是我们是否对从库的读有那么高的实时性要求,如果真的有,我们可以考虑使用同步复制策略,但是这种策略相比于异步复制策略会大大降低主库的响应时间和性能。我们是否可以在应用的设计层面去避开这个问题?

问题三:复制的不同模式有什么优缺点?我们如何选择?

答:基于语句的复制实际上是把主库上执行的SQL在从库上重新执行一遍,这么做的好处是实现起来简单,当前也有缺点,比如我们SQL里面使用了NOW(),当同一条SQL在从库中执行的时候显然和在主库中执行的结果是不一样的,注入此类问题可以类推。其次问题就是这种复制必须是串行的,为了保证串行执行,就需要更多的锁。

基于行的复制的时候二进制日志中记录的实际上是数据本身,这样从库可以得到正确的数据,这种方式缺点很明显,数据必须要存储在二进制日志文件中,这无疑增加的二进制日志文件的大小,同时增加的IO线程的负载和网络带宽消耗。而相比于基于语句的复制还有一个优点就是基于行的复制无需重放查询,省去了很多性能消耗。

无论哪种复制模式都不是完美的,日志如何选择,这个问题可以在理解他们的优缺点之后进行权衡。

问题四:复制的工作过程只有三个线程来完成,对于Master来说,写是并发的,也就出现了一个IO线程要把所有并发的数据变更事件记录,这个IO线程会不会累死?当一个Master对应多个Slave的时候,其实在Master中会唤起多个IO线程,这无疑会增加Master的资源开销,如果出现事件堆积,也就是事件太多,来不及及时发送出去怎么办?另外就是Slave那边的IO线程和SQL线程也会有对应主库并发数据变更事件,而Slave方单个线程处理的问题,这个时候Slave线程会不会累死?

答:上面的问题确实会发生,上面之一个问题和第二个问题其实是写负载的问题,当事件堆积太多,从库时延就会变大,Slave单SQL线程问题据说有参数可以开启并行操作,这个大家可以确认一下。

问题五:针对复制工作过程可能会出现的问题,主库写完二进制日志文件同时都会保存二进制日志的偏移量,但是当断电的时候,二进制日志文件没有刷新到磁盘,主库重新启动之后,从库尝试读该偏移量的二进制日志,会出现读不到的情况,这个问题应该怎么解决?

答:首先如果开启了sync_binlog选项,对于innodb同时设置innodb_flush_log_at_trx_commot=1,则可以保证二进制日志文件会被写入磁盘,但MyISAM引擎可能会导致数据损坏。如果没有开启这个选项,则可以通过制定从库的二进制偏移量为下一个二进制日志文件的开头,但是不能解决事件丢失问题。

问题六:从库在非计划的关闭或重启时,回去读master.info文件去找上次停止复制的位置,这同样会有一个问题,如果master.info不正确,就会导致复制数据不一致的情况,遇到这个问题怎么办?

答:这个问题可以通过两种方式解决,一是控制master.info在从库非计划关闭或重启的时候让master.info能够同步到磁盘,这样下次启动的时候就不会读取错误的信息,这有助于减少错误的发生概率。另外想要找到正确的复制位置是困难的,我们也可以选择忽略错误。

请点击输入图片描述

请点击输入图片描述

关于怎么拷贝数据库的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 拷贝数据库步骤详解,让你轻松备份数据! (怎么拷贝数据库)