Mysql学习笔记(十四)备份与恢复
学习内容:
1.数据库的重要数据备份...
2.什么时候需要使用到数据库备份..
3.如何恢复备份的数据..
1.备份:
说到备份,相比大家都不应该陌生,比如说我们平时在为我们的电脑重新做系统的时候,那么我们保存在电脑里的重要文件我们都需要进行备份..或者是当我们在使用一键还原系统的时候,我们也需要进行备份..那么数据库也不例外,我们需要对数据库里面保存的重要数据进行备份..比如说一个大型的企业,那么必然会有自己的一个大型数据库,那么数据库管理员必然会将自己企业的数据库进行备份,一旦数据库的数据丢失,那么管理员可以将数据恢复到当时备份时的状态,以至于企业不会有任何的损失...
i.使用mysqldump进行数据库备份...
mysqldump -u root -h localhost -p samp_db >d:\samp_db_2015.sql 解释一下这个语句:mysqldump关键字.. -u表示user,就是用户.... -h表示host,登陆用户的主机名称 -p表示password,登陆时的密码,这里localhost表示的是我们本机,还可以使用ip地址,比如说127.0.0.1也是可以的... samp_db表示我们要备份的数据库为samp_db... >.....表示要保存的位置... -- MySQL dump 10.13 Distrib 5.1.73, for Win64 (unknown) //这一行表示了我们使用mysqldump工具的版本号 -- -- Host: 127.0.0.1 Database: samp_db //主机信息和数据库备份的名称... -- ------------------------------------------------------ -- Server version 5.1.73-community //mysql服务器的版本号 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; //这里表示的是将一些系统变量赋给临时变量..以确保恢复数据的时候恢复系统变量,那么恢复系统变量的语句呢?在最后面...*/; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; DROP TABLE IF EXISTS `c_count`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `c_count` ( //这里表示的是我建立的表格,包含着表的基本信息.... `id` int(11) NOT NULL, `num` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=gbk; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `c_count` //这里代表注释部分mysql数据库的注释部分使用 --符号.. -- /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; //这是就是恢复我们保存的系统变量的值.... /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump completed on 2015-05-11 19:41:23
我这里截取的内容不全,因为我建的数据库表格信息太多..如果全截下来估计得很长...想必大家也没心情看...所以就简单的截了部分内容...
这里面包含着drop,insert,create等语句...我稍微的解释一下上面的含义.....看上表。。。
注:
1./*!.....*/部分表示的是可执行的mysql注释语句,这些语句只能在mysql中执行...在其他类型的数据库将被认定为注释内容,并且不会被执行,这里体现了数据库的可移植性...
2./*!40101...*/这个40101表示的是这段语句在mysql的4.01.01版本或者比这个更高的版本的条件下才能被执行....
ii.mysqldump实现对部分表的备份...
mysqldump -u root -h localhost -p samp_db shop >d:\samp_db_shop_2015.sql;
这个和上面基本差不多,就是在数据库的后面多追加了某个表格...如果是多个表格的话,我们可以使用空格来进行分隔...
iii.mysqldump备份全部或者多个数据库...
mysqldump -u root -h localhost -p --databases samp_db mysql >d:\databases_2015.sql //备份多个数据库,加 --databases mysqldump -u root -h localhost -p --all-databases >d:\all_databases_2015.sql; //备份全部的数据库,加 --all-databases
备份的内容也基本和第一个截取的一样...只是能多了一点东西,由于是多个数据库的备份,那么备份的内容将会指明哪一个数据库是samp_db,哪一个是mysql。。。多个数据库之间我们用空格分隔...
2.物理备份...
简单的介绍一下物理备份的内容...
i.直接对数据库的存储目录进行复制...这一般属于一种简答,快速,有效的备份方式。。。但是这种备份方式还是有缺点的..它无法对innodb存储引擎下的数据进行备份...并且还原的时候最好是还原到相同版本,不同版本可能会导致不兼容...
ii.另一种方式是使用mysqlhotcopy进行备份...mysqlhotcopy是在perl脚本下才能够运行的...这个被成为快速备份,并且只能备份myisam存储引擎下的表这个我没有进行过多的研究,所以就不班门弄斧了...
-------------------------------------------------------------------——————————————————————————
2.数据恢复<==>还原
还原就是我们所说的数据恢复,我们之所以要备份数据库,不就是为了当数据库出现问题的时候,我们把备份数据进行还原的吗。。。所以有了备份,那么自然也要有还原...
i.使用mysql语句指令进行还原...
mysql -u user -p [dbname]<filename.sql //基本语法
这个在上面备份数据库的时候,对各个部分都有了一个讲解,所以这里不一个一个部分进行讲解了,只是在恢复的时候变成了 < 号了 .....
mysql -u root -h localhost -p samp_db < d:\samp_db_2015.sql; //还原我们备份的数据库信息....
注意:执行上面这条命令的时候我们必须要把数据库建好,否则会导致错误的发生....
还有我们可以在登陆到了数据库以后使用source语句进行数据库恢复....
mysql> use samp_db; Database Changed mysql>source d:\samp_db_2015.sql; //使用source还原数据库里的数据信息
ii.物理还原...
1.第一种就是我们在备份的时候直接对数据库的存储目录进行了复制,那么当还原的时候我们只需要把我们复制的东西重新拷贝到我们的存储目录下就可以直接完成了数据库的还原...
说白了就是假如我们有一个数据库samp_db,里面有一些重要的数据信息,重要的数据信息在存储目录下一定是按文件进行存储的,我们把这些文件直接剪切,放置到一个文件夹中保存。。那么这样做,就代表samp_db数据库里的重要数据丢失了,然后我们把我们那个文件夹里的数据重新拷贝到samp_db文件夹中,这样就代表重要数据还原回来了...
注意:这种方法只能还原在同一版本下的数据库,并且只对myisam存储引擎有效,对innodb存储引擎无效...
2.mysqlhotcopy快速恢复...
这种我也没有进行深入的研究,因此不进行班门弄斧....
注意:如果需要恢复的数据库已经存在,则在使用DROP语句删除已经存在的数据库之后,恢复才能成功。另外mysql不同版本之间必须兼容,恢复之后的数据才可以使用!!
-----------———————————————————————————————————————————————————————
3.数据库迁移.
数据库的迁移:数据库的迁移一般由数据库管理员来搞定...在这里也简单的说一下....
迁移的一般原因:
1、需要安装新的数据库服务器
2、mysql版本更新
3、数据库管理系统变更(从SQLSERVER迁移到mysql)...
i.相同版本的数据库迁移:
相同版本的数据库迁移就是主版本号相同的数据库直接进行数据库移动...常用的方法就是使用mysqldump导出数据,然后在目标数据库使用mysql进行导入
mysqldump -h www.clearlove.com -u root -p database_name | mysql -h www.nuoyan.com -u root -p
mysqldump导入的数据直接通过管道符|,将www.clearlove.com上的数据库导入到www.nuoyan.com服务器上,database_name为数据库名...如果想导出全部的数据库则使用--all -databases参数...
ii.不同版本的mysql数据库的迁移:
因为数据库升级,需要将旧版本mysql数据库中的数据迁移到新版本数据库中。mysql服务器升级,需要先停止服务,然后卸载旧版本,并安装新版本的mysql.如果想保留旧版本中的用户访问控制信息,则需要备份mysql的mysql库,在新版本mysql安装完成后,重新读入mysql备份文件中的信息,旧版本和新版本的mysql可能使用不同的默认字符集,例如mysql.4.x中大多数使用latin1作为默认字符集,而mysql5.x的默认字符集为utf8。如果数据库中有中文数据,迁移过程中需要对默认字符集进行修改,不然可能无法正常显示结果。。。
新版本对旧版本有一定兼容性。从旧版本的mysql向新版本mysql迁移时,对于myisam引擎的表,可以直接复制数据库文件,
也可以用mysqlhotcopy工具、mysqldump工具。
对于innodb引擎的表一般只能使用mysqldump将数据导出。然后使用mysql命令导入目标服务器。
从新版本向旧版本mysql迁移数据时要小心,最好使用mysqldump命令导出,然后导入目标数据库中。
iii.不同数据库之间的迁移...
这种情况也是经常会有的,比如说将mysql迁移到oracle。。。这种迁移方式我们首先要比较两者之间的差异,不同的数据库在定义数据类型时的形式可能是不同的...比如说mysql中日期字段分为date和time两种,而oracle只有date一种...
-------------------------------------------------------------------------------------------------------------------------
4.导入和导出
导入:
在mysql中,当我们插入数据的时候,我们没必要一条条的输入sql语句来进行插入,我们还可以建立一个文本文件,然后将我们建立的文本文件的内容导入到数据库当中就可以了....
基本语法: LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' //这句话表示的是载入 file_name.txt文件, low_priority参数表示的是当没有人访问数据表格时,在进行插入... local表示的是导入本地文件,并且必须要有完整的文件位置....
[REPLACE | IGNORE] //表示参数控制对现有表的唯一键记录重复的处理。就是比如说文件内插入了重复数据,我们应该如何处理.. replace表示使用新的一行去代替....ignore表示直接跳过....
上面这个语句必须要进行指定,否则一旦出现重复就会导致错误的发生,并且后续的数据将不会被导入...
INTO TABLE tbl_name [FIELDS [TERMINATED BY 'string'] //表示字段之间使用某个指定的字符或者字符串进行分隔 [[OPTIONALLY] ENCLOSED BY 'char'] //表示每个字段使用指定的字符包起来 [ESCAPED BY 'char' ] //表示将默认的转义字符改变为某个指定的字符 ] [LINES [STARTING BY 'string'] //表示每行开头的字符,可以是一个或者多个 [TERMINATED BY 'string'] //表示每一行结束以某个指定字符结尾,一般都是\r\n...表示每一行结束都换行... ] [IGNORE number LINES] //表示忽略开始处的行数,number为忽略数 [(col_name_or_user_var,...)] [SET col_name = expr,...]]
load data infile 'd:\data.txt' into samp_db.shop; select * from shop;
将文件导入到smap_db数据库shop表格...
2.使用mysqlimport进行导入...
mysqlimport是一个独立的exe应用程序...和load data infile基本差不多...
基本语法: mysqlimport -u root -p dbname filename.txt [OPTIONS] --[OPTIONS] 选项 FIELDS TERMINATED BY 'value' ENCLOSED BY 'value' ESCAPED BY 'value' LINES TERMINATED BY 'value' IGNORE LINES
这个和语法和上面类似,所以不进行解释了。。。。
mysqlimport -u root -p samp_db d:\data.txt;
mysqlimport的功能和load data infile 基本一样,唯一就是没有指定字段的数据导入...下面指定的field字段中插入数据...这个功能mysqlimport是无法实现的....
load data infile d:\data.txt into table shop(shop_id,shop_name,shop_info);
导出:
有了导入,那么必然就有导出....
i.使用select into ....outfile进行导出...
基本语法: 和导入的基本语法有很多东西类似...就不进行解释了 select columnlist from Table WHERE condition into outfile 'filename' [OPTIONS] fields terminated by 'VALUE' fields [OPTIONALLY] ENCLOSED BY 'VALUE' fields ESCAPED BY 'VALUE' lines STARTING by 'VALUE' lines terminated by 'VALUE' select * from samp.shop into outfile d:\shop.txt FIELDS TERMINATED BY ',' ENCLOSED BY '\'' ESCAPED BY '\'' LINES TERMINATED BY '\r\n'; //按照了指定的规格进行数据的导入...
ii.使用mysqldump进行文件的导出...
mysqldump -T path -u root -p dbname [tables][OPTIONS] --fields-terminated-by= --fields-enclosed-by= --fields-optionally-enclosed-by= --fields-escaped-by= --lines-terminated-by= mysqldump -T d:\ -u root -h localhost -p samp_db shop; 这样就实现了数据的导出...
iii.我们还可以使用mysql进行数据的导出。。。这个相比mysqldump,导出数据的可读性更强。。。。
mysql -u root -p --execute="SELECT 语句" dbname >filename.txt//基本语法... mysql -u root -p --execute="SELECT * FROM person;" test>C:\person3.txt//还可以是.html文件或者.xml文件....
------------------------------------------------------------------------------------------------------------------------
截止到这里数据库就告一段落了,把基础的东西总算是学了个差不多了...还有很多东西没有学到。。。等以后在实际开发中在进行知识点的弥补吧...明天开始该进行JDBC的学习了。。。。。