设为首页 加入收藏

TOP

MySQL优化之――备份和恢复(四)
2015-11-21 01:47:11 来源: 作者: 【 】 浏览:5
Tags:MySQL 优化 备份 恢复
脚本如下

?

USE [sss]
GO
/****** Object:  Table [dbo].[test]    Script Date: 2014/7/24 11:27:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[test](
    [a] [int] NULL
) ON [PRIMARY]

GO
INSERT [dbo].[test] ([a]) VALUES (10)
GO

?

由于test表是没有任何索引的,所以脚本里看不到CREATE INDEX语句

实际上各种数据库的备份恢复方法都是大同小异的

ORACLE冷备份与恢复

逻辑备份和物理备份

1、导出create table 、create index、insert into 表等语句(逻辑备份)

mysql:mysqldump、load data infile、select into outfile

sqlserver:生成脚本、导入导出向导

oracle:(exp/imp)

2、直接复制文件(物理备份)

sqlserver:backup database语句、backup log语句、停SQLSERVER服务直接拷贝数据文件

mysql:mysqlhotcopy、innobackupex

oracle:rman、直接将关键性文件拷贝到另外的位置、(exp/imp)、(expdp/impdp)

相似点:上面的各种数据库的各种备份还原方法,每一种基本上都会有一个单独的工具来做

例如sqlserver导入导出向导就是一个单独的exe来做

oracle的rman也是一个单独的工具

冷备份和热备份:无论oracle、sqlserver、mysql都有冷备份和热备份的概念

冷备份其实可以简单理解为:停止服务进行备份

热备份其实可以简单理解为:不停止服务进行备份(在线)

上面的停止服务,正确的来讲应该是停止数据库的写入

为什么mysql的myisam引擎只支持冷备份呢?

大家可以先想一下innodb引擎,innodb引擎是事务性存储引擎,每一条语句都会写日志,并且每一条语句在日志里面都有时间点

那么在备份的时候,mysql可以根据这个日志来进行redo和undo,将备份的时候没有提交的事务进行回滚,已经提交了的进行重做

但是myisam不行,myisam是没有日志的,为了保证一致性,只能停机或者锁表进行备份

在书《MYSQL性能调优和架构设计》里面说到了事务的作用

\

大家可以想一想,为什么sqlserver支持从某一个lsn或者时刻进行恢复数据库,他也是从日志里面读取日志的lsn号来进行恢复到某一个lsn时刻的数据或者某一个时刻的数据

假如没有事务日志,那么sqlserver是做不到时点还原的

热备份、冷备份

为什么SQLSERVER需要停止SQLSERVER服务才可以拷贝物理数据文件,为的都是保证数据一致性

\


物理备份方法

1、直接复制整个数据库目录

因为MYSQL表保存为文件方式,所以可以直接复制MYSQL数据库的存储目录以及文件进行备份。

MYSQL的数据库目录位置不一定相同,在Windows平台下,MYSQL5.6存放数据库的目录通常默认为

C:\Documents and Settings\All User\Application Data\MySQL\MYSQL Server 5.6\data

或者其他用户自定义的目录;

在Linux平台下,数据库目录位置通常为/var/lib/mysql/,不同Linux版本下目录会有不同

这是一种简单、快速、有效的备份方式。要想保持备份一致,备份前需要对相关表执行LOCK TABLES操作,然后对表执行

FLUSH TABLES。这样当复制数据库目录中的文件时,允许其他客户继续查询表。需要FLUSH TABLES语句来确保开始

备份前将所有激活的索引页写入磁盘。

当然,也可以停止MYSQL服务再进行备份操作

这种方法虽然简单,但并不是最好的方法。因为这种方法对INNODB存储引擎的表不适用。使用这种方法备份的数据最好还原

到相同版本的服务器中,不同的版本可能不兼容。

注意:在mysql版本中,第一个数字表示主版本号,主版本号相同的MYSQL数据库文件格式相同

2、使用mysqlhotcopy工具快速备份

mysqlhotcopy是一个perl脚本,最初由Tim Bunce编写并提供。他使用LOCK TABLES 、FLUSH TABLES和cp或scp

来快速备份数据库。他是备份数据库或单个表的最快途径,但他只能运行在数据库目录所在机器上,并且只能备份myisam类型的表。

语法

?

mysqlhotcopy db_name_1,...db_name_n /path/to/new_directory

?

db_name_1...n代表要备份的数据库的名称;

path/to/new_directory指定备份文件目录

示例

在Linux下面使用mysqlhotcopy备份test库到/usr/backup

?

mysqlhotcopy -u root -p test /usr/backup

?

要想执行mysqlhotcopy,必须可以访问备份的表文件,具有那些表的SELECT权限、RELOAD权限(以便能够执行FLUSH TABLES)

和LOCK TABLES权限

提示:mysqlhotcopy只是将表所在目录复制到另一个位置,只能用于备份myisam和archive表。备份innodb表会出现错误信息

由于他复制本地格式的文件,故也不能移植到其他硬件或操作系统下


还原

逻辑还原

1、使用mysql命令进行还原

对于已经备份的包含CREATE、INSERT语句的文本文件,可以使用myslq命令导入数据库中

备份的sql文件中包含CREATE、INSERT语句(有时也会有DROP语句)。mysql命令可以直接执行文件中的这些语句

其语法如下:

?

mysql -u user -p [dbname]
  
   

?

user是执行backup.sql中语句的用户名;-p表示输入用户密码;dbname是数据库名

如果filename.sql文件为mysqldump工具创建的包含创建数据库语句的文件,执行的时候不需要指定数据库名

用mysql命令将school_2014-7-10.sql文件中的备份导入到数据库中

?

mysql -u root -h 127.0.0.1 -p school
    
     

?

执行语句之前我们必须建好school数据库,如果不存在恢复过程将会出错。

可以看到表数据都已经导入到数据库了

\

?

如果已经登录mysql,那么可以使用source命令导入备份文件

使用source命令导入备份文件school_2014-7-10.sql

\

执行source命令前必须使用use 语句选择好数据库,不然会出现ERROR 1046(3D000):NO DATABASE SELECTED 的错误

还有一点要注意的是只能在cmd界面下执行,不能在mysql工具里面执行source命令,否则会报错

因为cmd是直接调用mysql.exe来执行命令的

而这些mysql 编辑工具只是利用mysql con

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 4/9/9
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇MySql5.6Window超详细安装教程 下一篇警惕MySql更新sql的WHERE从句中的..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: