第一篇:我的MYSQL学习心得
我的MYSQL学习心得
一、使用视图的理由是什么?
1.安全性。一般是这样做的:创建一个视图,定义好该视图所操作的数据。之后将用户权限与视图绑定。这样的方式是使用到了一个特性:grant语句可以针对视图进行授予权限。2.查询性能提高。
3.有灵活性的功能需求后,需要改动表的结构而导致工作量比较大。那么可以使用虚拟表的形式达到少修改的效果。这是在实际开发中比较有用的
例子:假如因为某种需要,a表与b表需要进行合并起来组成一个新的表c。最后a表与b表都不会存在了。而由于原来程序中编
写sql分别是基于a表与b表查询的,这就意味着需要重新编写大量的sql(改成向c表去操作数据)。而通过视图就可以做到不修改。定义两个视图名字还是原来的表名a和b。a、b视图完成从c表中取出内容。说明:使用这样的解决方式,基于对视图的细节了解越详细越好。因为使用视图还是与使用表的语法上没区别。比如视图名a,那么查询还是“select * from a”。
4.复杂的查询需求。可以进行问题分解,然后将创建多个视图获取数据。将视图联合起来就能得到需要的结果了。
视图的工作机制:当调用视图的时候,才会执行视图中的sql,进行取数据操作。视图的内容没有存储,而是在视图被引用的时候才派生出数据。这样不会占用空间,由于是即时引用,视图的内容总是与真实表的内容是一致的。视图这样设计有什么好处?节省空间,内容是总是一致的话,那么我们不需要维护视图的内容,维护好真实表的内容,就可以保证视图的完整性了。
二、通过更新视图实现更新真实表
看到很多例子,更新视图可以更新真实表。原因,我是这样理解的:视图并没有保存内容。只是引用数据。那么,更新视图,其实就是以引用的方式操作了真实表 with check option:对视图进行更新操作的时,需要检查更新后的值是否还是满足视图公式定义的条件。通俗点,就是所更新的结果是否还会在视图中存在。如果更新后的值不在视图范围内,就不允许更新如果创建视图的时候,没有加上with check option,更新视图中的某项数据的话,mysql并不会进行有效性检查。删掉了就删掉了。在视图中将看不到了。
使用有效性检查,实际意义是什么?
视图的实践:重新组织表的需求
CREATE TABLE `result`(`MATH_NO` INT(10)NOT NULL unsigned AUTO_INCREMENT PRIMARY KEY, `TEAMNO` INT(10)NOT NULL, `PLAYERNO` INT(10)NOT NULL, `WON` VARCHAR(10)NOT NULL, `LOST` VARCAHR(10)NOT NULL, `CAPTAIN` INT(10)NOT NULL COMMIT '就是PLAYERNO的另外名字', `DIVISION` VARCHAR(10)NOT NULL)ENGINE=MYISAM DEFAULT CHARSET=utf8 COMMIT='重新组的新表' AUTO_INCREMENT=1
针对每个表创建一个视图,将数据保存进去: CREATE VIEW teams(TEAMNO,PLAYERNO,DIVISION)AS SELECT DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result
报错:#1050-Table 'teams' already exists
说明,因为视图也是一种表,是虚拟表。不能与已有的表(视图)出现重名
接下来,删掉表teams,再执行创建视图的代码。
将视图看成与表一样的东西,更加容易理解使用规则。下面这样对比也许使自己更好理解:
1.在使用视图的时候,就是与使用表的语法一样的。2.创建视图的时候,该视图的名字如果与已经存在表重名的话,那么会报错,不允许创建。视图就是一种特殊的表
3.创建视图的时候,可以这样使用CREATE VIEW teams(TEAMNO,PLAYERNO,DIVISION),可以定义视图表的结构。
4.在phpmyadmin中。左边的表列表中将视图与表列在了一起。只有通过右侧的状态“View:teams”可以知道该表是视图表。
视图在mysql中的内部管理机制:
视图的记录都保存在information_schema数据库中的一个叫views的表中。具体某个视图的定义代码以及属于哪个数据库等信息可以从里面看到理解视图的两种工作机制:
语句:select * from teams
针对上面语句,总结几个知识点
1.确认是视图的过程:teams也可以是表名。由于表与视图的物理机制不同。视图本身是不存储内容的。所以,在使用sql的 时候,mysql是怎么知道teams是一个视图还是表。是因为有一个查看目录的例程在做这件事。
2.mysql对处理视图的两种方法:替代方式和具体化方式。替换方式理解,视图名直接使用视图的公式替换掉了。针对上面视图teams,mysql会使用该视图的公式进行替换,视图公式合并到了select中。结果就是变成了如下sql语句: select * from(SELECT DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result)。也就是最后提交给mysql处理该sql语句。
具体化方式理解,mysql先得到了视图执行的结果,该结果形成一个中间结果暂时存在内存中。之后,外面的select语句就调用了这些中间结果(临时表)。
看起来都是要得到结果,形式上有区别,好像没体会到本质上的区别。两种方式又有什么样的不同呢?
替换方式,将视图公式替换后,当成一个整体sql进行处理了。具体化方式,先处理视图结果,后处理外面的查询需求。替换方式可以总结为,先准备,后执行。具体化方式总结理解为,分开处理。
哪种方式好?不知道。mysql会自己确定使用哪种方式进行处理的。自己在定义视图的时候也可以指定使用何种方式。像这样使用:
CREATE ALGORITHM=merge VIEW teams as SELECT DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result
ALGORITHM有三个参数分别是:merge、TEMPTABLE、UNDEFINED
看mysql手册中提到,替换与具体化的方式的各自适用之处,可以这样理解:
因为临时表中的数据不可更新。所以,如果使用参数是TEMPTABLE,无法进行更新。
当你的参数定义是UNDEFINED(没有定义ALGORITHM参数)。mysql更倾向于选择合并方式。是因为它更加有效。
第二篇:我的MYSQL学习心得
我的MYSQL学习心得
(十一)视图
我的MYSQL学习心得
(一)简单语法 我的MYSQL学习心得
(二)数据类型宽度 我的MYSQL学习心得
(三)查看字段长度
我的MYSQL学习心得
(四)数据类型 我的MYSQL学习心得
(五)运算符 我的MYSQL学习心得
(六)函数 我的MYSQL学习心得
(七)查询
我的MYSQL学习心得
(八)插入 更新 删除 我的MYSQL学习心得
(九)索引
我的MYSQL学习心得
(十)自定义存储过程和函数 我的MYSQL学习心得
(十二)触发器 我的MYSQL学习心得
(十三)权限管理 我的MYSQL学习心得
(十四)备份和恢复 我的MYSQL学习心得
(十五)日志 我的MYSQL学习心得(十六)优化 我的MYSQL学习心得(十七)复制
这一篇《我的MYSQL学习心得
(十一)》将会讲解MYSQL的视图 使用视图的理由是什么?
1、安全性:一般是这样做的:创建一个视图,定义好该视图所操作的数据。
之后将用户权限与视图绑定,这样的方式是使用到了一个特性:grant语句可以针对视图进行授予权限。
2、查询性能提高
3、有灵活性的功能需求后,需要改动表的结构而导致工作量比较大,那么可以使用虚拟表的形式达到少修改的效果。这是在实际开发中比较有用的
4、复杂的查询需求,可以进行问题分解,然后将创建多个视图获取数据。将视图联合起来就能得到需要的结果了。
创建视图 创建视图的语法
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] 其中,CREATE:表示新建视图; REPLACE:表示替换已有视图 ALGORITHM :表示视图选择算法 view_name :视图名 column_list:属性列
select_statement:表示select语句
[WITH [CASCADED | LOCAL] CHECK OPTION]参数表示视图在更新时保证在视图的权限范围之内
可选的ALGORITHM子句是对标准SQL的MySQL扩展。
ALGORITHM可取三个值:MERGE、TEMPTABLE或UNDEFINED。
如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。算法会影响MySQL处理视图的方式。
对于MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。
对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。
对于UNDEFINED,MySQL自己选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。
LOCAL和CASCADED为可选参数,决定了检查测试的范围,默认值为CASCADED。脚本 视图的数据来自于两个表
CREATE TABLE student(stuno INT ,stuname NVARCHAR(60))CREATE TABLE stuinfo(stuno INT ,class NVARCHAR(60),city NVARCHAR(60))
INSERT INTO student VALUES(1,'wanglin'),(2,'gaoli'),(3,'zhanghai')
INSERT INTO stuinfo VALUES(1,'wuban','henan'),(2,'liuban','hebei'),(3,'qiban','shandong')
--创建视图
CREATE VIEW stu_class(id,NAME,glass)AS SELECT student.`stuno`,student.`stuname`,stuinfo.`class` FROM student ,stuinfo WHERE student.`stuno`=stuinfo.`stuno`
SELECT * FROM stu_class
查看视图
查看视图必须要有SHOW VIEW权限
查看视图的方法包括:DESCRIBE、SHOW TABLE STATUS、SHOW CREATE VIEW DESCRIBE查看视图基本信息
DESCRIBE 视图名 DESCRIBE stu_class 结果显示了视图的字段定义、字段的数据类型、是否为空、是否为主/外键、默认值和额外信息
DESCRIBE一般都简写成DESC
SHOW TABLE STATUS语句查看查看视图基本信息 查看视图的信息可以通过SHOW TABLE STATUS的方法
SHOW TABLE STATUS LIKE 'stu_class'
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
stu_class(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)VIEW
COMMENT的值为VIEW说明该表为视图,其他的信息为NULL说明这是一个虚表,如果是基表那么会基表的信息,这是基表和视图的区别
SHOW CREATE VIEW语句查看视图详细信息
SHOW CREATE VIEW stu_class View Create View character_set_client collation_connection-----------------------------------------------------------------
stu_class CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `stu_class` AS select `student`.`stuno` AS `id`,`student`.`stuname` AS `name`,`stuinfo`.`class` AS `class` from(`student` join `stuinfo`)where(`student`.`stuno` = `stuinfo`.`stuno`)utf8 utf8_general_ci 执行结果显示视图的名称、创建视图的语句等信息
在VIEWS表中查看视图的详细信息
在MYSQL中,INFORMATION_SCHEMA VIEWS表存储了关于数据库中的视图的信息 通过对VIEWS表的查询可以查看数据库中所有视图的详细信息
SELECT * FROM `information_schema`.`VIEWS` TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE CHARACTER_SET_CLIENT COLLATION_CONNECTION-------------------------------------------------------------------------------------------------------------------------------------------def school stu_class select
`school`.`student`.`stuno` AS `id`,`school`.`student`.`stuname` AS `name`,`school`.`stuinfo`.`class` AS `class` from `school`.`student` join `school`.`stuinfo` where(`school`.`student`.`stuno` = `school`.`stuinfo`.`stuno`)NONE YES root@localhost DEFINER utf8 utf8_general_ci 当前实例下只有一个视图stu_class
修改视图
修改视图是指修改数据库中存在的视图,当基本表的某些字段发生变化时,可以通过修改视图来保持与基本表的一致性。
MYSQL中通过CREATE OR REPLACE VIEW 语句和ALTER语句来修改视图 语法如下:
ALTER OR REPLACE [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] 该语句用于更改已有视图的定义。其语法与CREATE VIEW类似。当视图不存在时创建,存在时进行修改
修改视图 DELIMITER $$
CREATE OR REPLACE VIEW `stu_class` AS SELECT
`student`.`stuno` AS `id` FROM(`student` JOIN `stuinfo`)WHERE(`student`.`stuno` = `stuinfo`.`stuno`)$$
DELIMITER;
通过DESC来查看更改之后的视图定义
DESC stu_class 可以看到只查询一个字段
ALTER语句修改视图
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] 这里关键字跟前面的一样,这里不做介绍
使用ALTER语句修改视图 stu_class ALTER VIEW stu_class AS SELECT stuno FROM student;使用DESC查看
DESC stu_class
更新视图
更新视图是指通过视图来插入、更新、删除表数据,因为视图是虚表,其中没有数据。通过视图更新的时候都是转到基表进行更新,如果对视图增加或者删除记录,实际上是对基表增加或删除记录
我们先修改一下视图定义
ALTER VIEW stu_class AS SELECT stuno,stuname FROM student;查询视图数据
UPDATE
UPDATE stu_class SET stuname='xiaofang' WHERE stuno=2
查询视图数据
更新成功
INSERT INSERT INTO stu_class VALUES(6,'haojie')
插入成功
DELETE
DELETE FROM stu_class WHERE stuno=1
删除成功 当视图中包含如下内容的时候,视图的更新操作将不能被执行(1)视图中包含基本中被定义为非空的列
(2)定义视图的SELECT语句后的字段列表中使用了数学表达式(3)定义视图的SELECT语句后的字段列表中使用聚合函数
(4)定义视图的SELECT语句中使用了DISTINCT、UNION、TOP、GROUP BY、HAVING子句
第三篇:MySQL学习心得
MySQL学习心得
第一章
一、数据库管理系统(DBMS)是操作和管理数据库的大型软件,它按一定的数据模型组织数据。
例如:Oracle、SQL Server、MySQL、Access。
二、数据库应用系统在数据库管理系统(DBMS)支持下建立的计算机应用系统,简写:DBAS。
例如:.net Java。
三、字符集从大到小排序:utf8--gbk--gb2312。
四、mysql的特点:
适用于中小型网站中,体积小、速度快、总体拥有成本低,尤其是有开放源码这一特点。
五、目前Internet上浒的网站构架方式是LAMP(Linux+apache+mysql+php)即使用Linux作为操作系统,Apache作为Web服务器,MySQL作为数据库,PHP作为服务器端脚本解释器,由于4个软件都是遵循GPL的开放源码软件,因此使用这种方式不用花一分钱就可以建立起一个稳定、免费的网站系统。
第二章
一、安装过程中遇到的问题及解决方法:
安装过程中没有完成时计算机关机。(没有删除完文件)安装完成时找不到所配置的路径。(可以从配置文件中找到)
安装完成后无法正常使用。(在计算机管理中重新启动MySQL服务)安装到一半时没有出现下一步。(误把配置文件删除了)安装到最后一步时start service错误。到控制面板里面先把mysql删除.到c盘C:Program Files目录下把mysql目录删除.如果在其他盘还有设置目录也要删除.空目录也要删除 到regedit把注册表
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/Eventlog/Applications/MySQL HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/Services/Eventlog/Applications/MySQL HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Applications/MySQL 有的话,全部删除!(技巧:用F3循环查找“mysql”)如果任务管理器里有关mysql内容也删除 把防火墙关了
重新装mysql(这里我没有重启计算机)
重装时候有必要的话,重启计算机,停用IIS,和删除temp里的临时文件.实在不行的话,配置mysql时候,把mysql服务换个服务名.使用时输入中文会出错。(在配置时在“Character Set”选框中将latinl修改为gb2312;也可以在配置文件中修改)
二、启动服务器的方法: ① 方法1:
在 “计算机管理”中的“服务”项目中启动与停止。② 方法2: 使用命令(net start mysql和net stop mysql)
三、连接MySQL 格式: mysql-h主机地址-u用户名 -p用户密码
①先在打开DOS窗口,然后进入目录 mysqlbin(如果设置了环境变量,则直接输入命令即可。)②键入命令mysql-uroot-proot ③接回车即可进入到MYSQL中了 MYSQL的提示符是:mysql> 注明:直接打开Mysql command line client
四、MySQL注释符有三种: ①#...②“--...” ③
五、忘记密码重新更改密码
先停止mysql服务,修改D:MySQLMySQL Server 5.0 目录下的my.ini文件,在[mysqld]下添加skip-grant-tables 启动mysql服务后就可以以空密码登录,之后别忘记修改root密码
use mysql update user set password=password('hanaixia')where user='root';(分号不能少)password('hanaixia')此处必须用函数设置。
修改密码后需要重新启动服务或者使用 flush privileges;语句,用于从mysql数据库中的授权表重新载入权限。
把 skip-grant-tables 这一句删掉再重启mysql服务。
第四篇:Mysql数据库学习心得
Mysql数据库学习心得(1)
由于工作中需要使用mysql,笔者通过网上学习,动手实践,终于从一个“数据库菜鸟”变成了能熟练操作mysql的“准大虾”了,:)。现将学习心得整理如下。
MySQL是完全网络化的跨平台关系型数据库系统,一个真正的多用户、多线程SQL数据库服务器,同时是具有客户机/服务器体系结构的分布式数据库管理系统。它具有功能强、使
用简便、管理方便、运行速度快、安全可靠性强等优点,用户可利用许多语言编写访问MySQL数据库的程序,对于中、小型应用系统是非常理想的。除了支持标准的ANSI SQL语句,更重要的是,它还支持多种平台,而在Unix系统上该软件支持多线程运行方式,从而能获得相当好的性能。对于不使用Unix的用户,它可以在Windows NT系统上以系统服务方式运行,或者在Windows 95/98系统上以普通进程方式运行。而在Unix/Linux系统上,MySQL支持多线程运行方式,从而能获得相当好的性能,而且它是属于开放源代码软。
MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和很多不同的客户程序和库组成,MySQL的执行性能非常高,运行速度非常快,并非常容易使用,是一个非常棒的数据库。MySQL的官方发音是“My Ess Que Ell”(不是MY-SEQUEL)。
一.获得MySQL
首先必须下载MySQL。Mysql的官方网站是:www.xiexiebang.comf copy为c:my.cnf,并把c:mysqlibgwinb19.dll copy到winntsystem32。
3。启动mysql的方法是:
c:mysqlinmysqld-shareware--install
net start mysql
这么简单,就可以启动了。
4。更改超级用户(root)的密码:
C:mysqlinmysql mysql
mysql> UPDATE user SET password=PASSWORD('your password')swheresuser='root';
mysql> QUIT
C:mysqlinmysqladmin reload
使用命令C:mysqlinmysqlshow去看看检测一下。在这里应该显示:
+-----------+
| Databases |
+-----------+
| mysql |
| test |
+-----------+
看到这些信息这一步就证明没问题了
再来:
C:mysqlinmysqlshow--user=root--password=your password mysql
在这里应该显示:
Database: mysql
+--------------+
| Tables |
+--------------+
| columns_priv |
| db |
| host |
| tables_priv |
| user |
+--------------+
一切搞定!
5。C:mysqlinmysqladmin version status proc
应该可以看到这些版本信息的:
mysqladmin Ver 8.0 Distrib 3.22.32, for Win95/Win98 on i586
TCX Datakonsult AB, by Monty
Server version 3.22.32-shareware-debug
Protocol version 10
Connection localhost via TCP/IP
TCP port 3306
Uptime: 1 hour 29 min 30 sec
Threads: 1 Questions: 72 Slow queries: 0 Opens: 16 Flush tables: 1 Open tables: 0 Memory in use: 16423K Max memory
used: 16490K
Uptime: 5370 Threads: 1 Questions: 72 Slow queries: 0 Opens: 16 Flush tables: 1 Open tables: 0 Memory in use: 16423K
Max memory used: 16490K
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+----+---------+------+-------+------------------+
| 35 | ODBC | localhost | | Query | 0 | | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+
接着,用show databases命令可以将安装的数据库列出来:
mysql> show databases;
你就可以看到:
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+ rows in set(0.00 sec)
如果一切正常的话,那说明MySQL可以完全工作了!如果要退出程序,输入:exit
mysql> exit;
Bye
Mysql数据库学习心得(3)------------------
三.Mysql常识
(一)字段类型
1.INT[(M)]
正常大小整数类型
2.DOUBLE[(M,D)] [ZEROFILL]
正常大小(双精密)浮点数字类型
3.DATE
日期类型。支持的范围是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式来显示DATE值,但是允许你使用字符串或数字把值赋给
DATE列
4.CHAR(M)
定长字符串类型,当存储时,总是是用空格填满右边到指定的长度
5.BLOB TEXT
BLOB或TEXT类型,最大长度为65535(2^16-1)个字符。
6.VARCHAR
变长字符串类型,最常用的类型。
(二)基本操作
1:显示数据库
mysql>SHOW DATABASES;
2:当前选择的数据库,mysql> SELECT DATABASE();
+------------+
| DATABASE()|
+------------+
| test |
+------------+
3.当前数据库包含的表信息:
mysql> SHOW TABLES;
+---------------------+
| Tables in test |
+---------------------+
| mytable1 |
| mytable2 |
+---------------------+
4.获取表结构
mysql> desc mytable1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| s1 | varchar(20)| YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
5.创建表
表是数据库的最基本元素之一,表与表之间可以相互独立,也可以相互关联。创建表的基本语法如下:
create table table_name
(column_name datatype {identity |null|not null},…)
其中参数table_name和column_name必须满足用户数据库中的识别器(identifier)的要求,参数datatype是一个标准的SQL类型或由用户数
据库提供的类型。用户要使用non-null从句为各字段输入数据。
create table还有一些其他选项,如创建临时表和使用select子句从其他的表中读取某些字段组成新表等。还有,在创建表是可用PRIMARY
KEY、KEY、INDEX等标识符设定某些字段为主键或索引等。书写上要注意:在一对圆括号里的列出完整的字段清单。字段名间用逗号隔开
。字段名间的逗号后要加一个空格。最后一个字段名后不用逗号。所有的SQL陈述都以分号“;”结束。
例:
mysql>CREATE TABLE guest(name varchar(10),sex varchar(2),age int(3),career varchar(10));
6.创建索引
索引用于对数据库的查询。一般数据库建有多种索引方案,每种方案都精于某一特定的查询类。索引可以加速对数据库的查询过程。创建
索引的基本语法如下:
create index index_name
on table_name(col_name[(length)],...)
例:
mysql> CREATE INDEX number ON guest(number(10));
7.执行查询
查询是使用最多的SQL命令。查询数据库需要凭借结构、索引和字段类型等因素。大多数数据库含有一个优化器(optimizer),把用户的查
询语句转换成可选的形式,以提高查询效率。
值得注意的是MySQL不支持SQL92标准的嵌套的where子句,即它只支持一个where子句。其基本语法如下:
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
select_expression,...[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY col_name,...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] rows]
[PROCEDURE procedure_name] ]
其中where从句是定义选择标准的地方,where_definition可以有不同的格式,但都遵循下面的形式:
字段名操作表达式
字段名操作字段名
在第一种形式下,标准把字段的值与表达式进行比较;在第二种形式下,把两个字段的值进行比较。根据所比较的数据类型,search_condition中的操作可能选以下几种:
=检查是否相等
!=检查是否不等
>(或>=)检查左边值是否大于(或大于等于)右边值
<(或<=)检查左边值是否小于(或小于等于)右边值
[not] between检查左边值是否在某个范围内
[not] in检查左边是否某个特定集的成员
[not] like检查左边是否为右边的子串
is [not] null检查左边是否为空值
在这里,可以用通配符_代表任何一个字符,%代表任何字符串。使用关键字、和可以生成复杂的词,它们运行检查时使用
布尔表达式的多重标准集。
例:
mysql> select t1.name, t2.salary from employee AS t1, info AS t2swherest1.name = t2.name;
mysql> select college, region, seed from tournament
ORDER BY region, seed;
mysql> select col_name from tbl_nameswherescol_name > 0;
8.改变表结构
在数据库的使用过程中,有时需要改变它的表结构,包括改变字段名,甚至改变不同数据库字段间的关系。可以实现上述改变的命令是
alter,其基本语法如下:
alter table table_name alter_spec [, alter_spec...]
例:
mysql> alter table dbname add column userid int(11)not null primary key auto_increment;
这样,就在表dbname中添加了一个字段userid,类型为int(11)。
9.修改表中数据
在使用数据库过程中,往往要修改其表中的数据,比如往表中添加新数据,删除表中原有数据,或对表中原有数据进行更改。它们的基本
语法如下:
数据添加:
insert [into] table_name [(column(s))]
values(expression(s))
例:
mysql>insertsintosmydatabase values('php','mysql','asp','sqlserver','jsp','oracle');Mysql数据库学习心得(4)------------------
10.表的数据更新
(1)一次修改一个字段,再次注意语法。文本需要加引号但数字不要。
mysql>update table01 set field03='new info'swheresfield01=1;
Query OK, 1 row affected(0.00 sec)
(2)一次改变多个字段,记住在每一个更新的字段间用逗号隔开。
mysql>update table01 set field04=19991022, field05=062218swheresfield01=1;
Query OK, 1 row affected(0.00 sec)
(3)一次更新多个数据
mysql>update table01 set field05=152901swheresfield04>19990101;
Query OK, 3 rows affected(0.00 sec)
11.删除数据
mysql>delete from table01swheresfield01=3;
Query OK, 1 row affected(0.00 sec)
12.导入数据库表
(1)创建.sql文件
(2)先产生一个库如auction.c:mysqlin>mysqladmin-u root-p creat auction,会提示输入密码,然后成功创建。
(3)导入auction.sql文件
c:mysqlin>mysql-u root-p auction < auction.sql。
通过以上操作,就可以创建了一个数据库auction以及其中的一个表auction。
13.mysql数据库的授权
mysql>grant select,insert,delete,create,drop
on *.*(或test.*/user.*/..)
to用户名@localhost
identified by '密码';
如:新建一个用户帐号以便可以访问数据库,需要进行如下操作:
mysql> grant usage
-> ON test.*
-> TO testuser@localhost;
Query OK, 0 rows affected(0.15 sec)
此后就创建了一个新用户叫:testuser,这个用户只能从localhost连接到数据库并可以连接到test数据库。下一步,我们必须指定
testuser这个用户可以执行哪些操作:
mysql> GRANT select, insert, delete,update
-> ON test.*
-> TO testuser@localhost;
Query OK, 0 rows affected(0.00 sec)
此操作使testuser能够在每一个test数据库中的表执行SELECT,INSERT和DELETE以及UPDATE查询操作。现在我们结束操作并退出MySQL客户
程序:
mysql> exit
Bye
14.授权MySQL用户密码
MySQL数据库的默认用户名为“root”(MS SQL Server的sa相似),密码默认为空。在DOS提示符(注 意,不是mysql提示符)下输入
c:mysqlin>“mysqladmin-u root-p password newpassword
回车后会提示你输入原来的密码,由于原来密码为空,直接回车,root用户的密码便改为”newpassword“了。
Mysql数据库学习心得(5)------------------
四.安装phpMyAdmin
MySQL图形界面管理器phpMyAdmin是一套以php3写成,针对MySQL数据库系统的Web管理界面。它可以很方便地以图形化界面,来对MySQL数据库里的字段、数据进行增加、删除等的动作,更可以做数据库本身的增删管理;phpMyAdmin可以管理整个MySQL服务器(需要超级用户),也可以管理单个数据库。另外,您也可以通过使用这个图形化界面来学习SQL正确的语法,直至熟练掌握。那要等到你看过MySQL手册中相关的部分。你可以到http://www.phpwizard.net/phpMyAdmin/去下载最新的版本。
首先,将phpMyAdmin软件包解到一个目录下。
1.修改文档config.inc.php3。
将原来的设定:
§cfgServers[1]['host'] = '';// MySQL hostname
§cfgServers[1]['port'] = '';// MySQL port-leave blank fordefault port
§cfgServers[1]['adv_auth'] = false;// Use advanced authentication?
§cfgServers[1]['stduser'] = '';// MySQL standard user(only needed with advanced auth)
§cfgServers[1]['stdpass'] = '';// MySQL standard password(only needed with advanced auth)
§cfgServers[1]['user'] = '';// MySQL user(only needed withbasic auth)
§cfgServers[1]['password'] = '';// MySQL password(only needed with basic auth)
§cfgServers[1]['only_db'] = '';// If set to a db-name, only this db is accessible
§cfgServers[1]['verbose'] = '';// Verbose name for this host-leave blank to show the hostname
:
:
require(”english.inc.php3“);
修改成:
§cfgServers[1]['host'] = 'MySQL Server的hostname';//填入您的MySQL Server的主机名称
§cfgServers[1]['port'] = '';//填入连结MySQL的port,不填则以预设的port进行连结
§cfgServers[1]['adv_auth'] = true;//改成true则进入phpMyAdmin必须先身份认证
§cfgServers[1]['stduser'] = 'root';// MySQL使用者的帐号
§cfgServers[1]['stdpass'] = '密码';// MySQL使用者的密码
§cfgServers[1]['user'] = 'root';// MySQL管理帐号
§cfgServers[1]['password'] = '密码';// MySQL管理密码
§cfgServers[1]['only_db'] = '';//指定管理的资库名称,不填则可以管理整个Server
§cfgServers[1]['verbose'] = '';//指定MySQL的名称,不填则使用系统本身的hostname
:
:
require(”chinese_gb.inc.php3");//将语言改成中文
说明:
(1)因本管理接口,可以以一个接口,管理多个MySQL Server,所以可以在config.inc.php3中找到
§cfgServers[1]...§cfgServers[1]...§cfgServers[1]...:
§cfgServers[2]...§cfgServers[2]...§cfgServers[2]...其中[1]代表第一个MySQL Server,[2]代表第二个MySQL Server,您要管理的MySQL Server超过三台以上,您可以依照同样的?述,增加[4].....下去!
(2)若您的MySQL Server与http Server是同一台,则§cfgServers[1]['host'] =可直接填入localhost。
最后,打开流览器,输入你的网址/phpMyAdmin之后您会看到一个密码验证的小窗口,输入您的MySQL管理帐号及密码,即可成功地看到phpMyAdmin的管理画面。通过phpmyadmin,你就可以图形化的、方便的管理你的所有数据库了。
五.小结
通过以上的学习和操作,终于可以自由操作mysql数据库了,也可以轻车熟路的使用php或者asp调用mysql了。最后,笔者要特别感谢开发了mysql并且免费贡献的天才以及在网上提供mysql使用说明的大虾们。
第五篇:我的MYSQL学习心得备份和恢复
备份
逻辑备份方法
使用MYSQLDUMP命令备份
MYSQLDUMP是MYSQL提供的一个非常有用的数据库备份工具。mysqldump命令执行时将数据库备份成一个文本文件,该文件中实际上包含了多个CREATE 和INSERT语句,使用这些语句可以重新创建表和插入数据
MYSQLDUMP的语法和选项
mysqldump-u user-p pwd-h host dbname[tbname,[tbname...]]>filename.sql
选项/Option 作用/Action Performed--add-drop-table
这个选项将会在每一个表的前面加上DROP TABLE IF EXISTS语句,这样可以保证导回MySQL数据库的时候不会出错,因为每次导回的时候,都会首先检查表是否存在,存在就删除--add-locks这个选项会在INSERT语句中捆上一个LOCK TABLE和UNLOCK TABLE语句。这就防止在这些记录被再次导入数据库时其他用户对表进行的操作-c or-complete_insert 这个选项使得mysqldump命令给每一个产生INSERT语句加上列(field)的名字。当把数据导出导另外一个数据库时这个选项很有用。--delayed-insert 在INSERT命令中加入DELAY选项-F or-flush-logs 使用这个选项,在执行导出之前将会刷新MySQL服务器的log.-f or-force 使用这个选项,即使有错误发生,仍然继续导出--full 这个选项把附加信息也加到CREATE TABLE的语句中-l or-lock-tables 使用这个选项,导出表的时候服务器将会给表加锁。-t or-no-create-info 这个选项使的mysqldump命令不创建CREATE TABLE语句,这个选项在您只需要数据而不需要DDL(数据库定义语句)时很方便。-d or-no-data 这个选项使的mysqldump命令不创建INSERT语句。
在您只需要DDL语句时,可以使用这个选项。--opt 此选项将打开所有会提高文件导出速度和创造一个可以更快导入的文件的选项。-q or-quick 这个选项使得MySQL不会把整个导出的内容读入内存再执行导出,而是在读到的时候就写入导文件中。-T path or-tab = path 这个选项将会创建两个文件,一个文件包含DDL语句或者表创建语句,另一个文件包含数据。DDL文件被命名为table_name.sql,数据文件被命名为table_name.txt.路径名是存放这两个文件的目录。目录必须已经存在,并且命令的使用者有对文件的特权。-w “WHERE Clause” or-where = “Where clause ” 如前面所讲的,您可以使用这一选项来过筛选将要放到 导出文件的数据。
假定您需要为一个表单中要用到的帐号建立一个文件,经理要看今年(2004年)所有的订单(Orders),它们并不对DDL感兴趣,并且需要文件有逗号分隔,因为这样就很容易导入到Excel中。为了完成这个任务,您可以使用下面的句子:
bin/mysqldump –p –where “Order_Date >='2000-01-01'” –tab = /home/mark –no-create-info –fields-terminated-by=, Meet_A_Geek Orders 这将会得到您想要的结果。schema:模式
The set of statements, expressed in data definition language, that completely describe the structure of a data base.一组以数据定义语言来表达的语句集,该语句集完整地描述了数据库的结构。SELECT INTO OUTFILE :
mysqldump提供了很多选项,包括调试和压缩的,在这里只是列举最有用的。运行帮助命令mysqldump--help可以获得特定版本的完整选项列表
user表示用户名称;
host表示登录用户的主机名称; pwd为登录密码;
dbname为需要备份的数据库名称;
tbname为dbname数据库中需要备份的数据表,可以指定多个需要备份的表; 右箭头“>”告诉mysqldump将备份数据库表定义和数据写入备份文件; filename为备份文件的名称
1、使用mysqldump备份单个数据库中的所有表 数据库的记录是这样的
打开cmd,然后执行下面的命令
可以看到C盘下面已经生成了school_2014-7-10.sql文件
使用editplus来打开这个sql文件
--MySQL dump 10.13 Distrib 5.5.20, for Win32(x86)----Host: 127.0.0.1 Database: school---------------------------Server version 5.5.20-log
/*!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 */;----Table structure for table `book`--DROP TABLE IF EXISTS `book`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `book`(`bookid` int(11)NOT NULL, `bookname` varchar(255)NOT NULL, `authors` varchar(255)NOT NULL, `info` varchar(255)DEFAULT NULL, `comment` varchar(255)DEFAULT NULL, `year_publication` year(4)NOT NULL, KEY `BkNameIdx`(`bookname`))ENGINE=MyISAM DEFAULT CHARSET=utf8;/*!40101 SET character_set_client = @saved_cs_client */;----Dumping data for table `book`--
LOCK TABLES `book` WRITE;/*!40000 ALTER TABLE `book` DISABLE KEYS */;INSERT INTO `book` VALUES(1,'鍓戝湥','灏忔槑','13','hao',2013);/*!40000 ALTER TABLE `book` ENABLE KEYS */;UNLOCK TABLES;----Table structure for table `student`--DROP TABLE IF EXISTS `student`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `student`(`stuno` int(11)DEFAULT NULL, `stuname` varchar(60)DEFAULT NULL)ENGINE=InnoDB DEFAULT CHARSET=utf8;/*!40101 SET character_set_client = @saved_cs_client */;----Dumping data for table `student`--
LOCK TABLES `student` WRITE;/*!40000 ALTER TABLE `student` DISABLE KEYS */;INSERT INTO `student` VALUES
(2,'xiaofang'),(3,'zhanghai'),(6,'haojie');/*!40000 ALTER TABLE `student` ENABLE KEYS */;UNLOCK TABLES;----Table structure for table `stuinfo`--DROP TABLE IF EXISTS `stuinfo`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `stuinfo`(`stuno` int(11)DEFAULT NULL, `class` varchar(60)DEFAULT NULL, `city` varchar(60)DEFAULT NULL)ENGINE=InnoDB DEFAULT CHARSET=utf8;/*!40101 SET character_set_client = @saved_cs_client */;----Dumping data for table `stuinfo`--
LOCK TABLES `stuinfo` WRITE;/*!40000 ALTER TABLE `stuinfo` DISABLE KEYS */;INSERT INTO `stuinfo` VALUES
(1,'wuban','henan'),(2,'liuban','hebei'),(3,'qiban','shandong');/*!40000 ALTER TABLE `stuinfo` ENABLE KEYS */;UNLOCK TABLES;/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;/*!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 2014-07-23 22:04:16
可以看到,备份文件包含了一些信息,文件开头首先写明了mysqldump工具的版本号; 然后是主机信息,以及备份的数据库名称,最后是mysql服务器的版本号5.5.20
备份文件接下来的部分是一些SET语句,这些语句将一些系统变量赋值给用户定义变量,以确保被恢复的数据库的系统变量和原来 备份时的变量相同 例如:
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;该set语句将当前系统变量character_set_client的值赋值给用户变量@OLD_CHARACTER_SET_CLIENT 备份文件的最后几行mysql使用set语句恢复服务器系统变量原来的值,例如:
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;该语句将用户定义变量@OLD_CHARACTER_SET_CLIENT 中保存的值赋值给实际的系统变量OLD_CHARACTER_SET_CLIENT 备份文件中的“--”字符开头的行为注释语句;以“/*!”开头、以“*/”结尾的语句为可执行的mysql注释,这些语句可以被mysql执行
但在其他数据库管理系统将被作为注释忽略,这可以提高数据库的可移植性
另外注意到,备份文件开始的一些语句以数字开头,这些数字代表了mysql版本号,该数字告诉我们这些语句只有在指定的mysql版本 或者比该版本高的情况下才能执行。
例如:40101,表明这些语句只有在mysql版本为4.01.01或者更高版本的条件下才可以执行
2、使用mysqldump备份数据库中的某个表 备份school数据库里面的book表
--MySQL dump 10.13 Distrib 5.5.20, for Win32(x86)----Host: 127.0.0.1 Database: school---------------------------Server version 5.5.20-log
/*!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 */;----Table structure for table `book`--DROP TABLE IF EXISTS `book`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `book`(`bookid` int(11)NOT NULL, `bookname` varchar(255)NOT NULL, `authors` varchar(255)NOT NULL, `info` varchar(255)DEFAULT NULL, `comment` varchar(255)DEFAULT NULL, `year_publication` year(4)NOT NULL, KEY `BkNameIdx`(`bookname`))ENGINE=MyISAM DEFAULT CHARSET=utf8;/*!40101 SET character_set_client = @saved_cs_client */;----Dumping data for table `book`--
LOCK TABLES `book` WRITE;/*!40000 ALTER TABLE `book` DISABLE KEYS */;INSERT INTO `book` VALUES(1,'剑圣','小明','13','hao',2013);/*!40000 ALTER TABLE `book` ENABLE KEYS */;UNLOCK TABLES;/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;/*!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 2014-07-23 22:24:29
备份文件中的内容跟前面的介绍是一样的,唯一不同的是只包含了book表的CREATE语句和INSERT语句
3、使用mysqldump备份多个数据库
如果要使用mysqldump备份多个数据库,需要使用--databases参数。
使用--databases参数之后,必须指定至少一个数据库的名称,多个数据库名称之间用空格隔开
使用mysqldump备份school库和test库
备份文件里的内容,基本上跟第一个例子一样,但是指明了里面的内容那一部分属于test库,哪一部分属于school库
View Code
4、使用--all-databases参数备份系统中所有的数据库 使用--all-databases不需要指定数据库名称
执行完毕之后会产生all_2014-7-10.sql的备份文件,里面会包含了所有数据库的备份信息
提示:如果在服务器上进行备份,并且表均为myisam,应考虑使用mysqlhotcopy 因为可以更快地进行备份和恢复
使用mysqlhotcopy,如果是Windows操作系统,需要先安装perl脚本组件才能使用,因为mysqlhotcopy是使用perl来编写的提示
(1)如果你未使用--quick或者--opt选项,那么mysqldump将在转储结果之前把全部内容载入到内存中。这在你转储大数据量的数据库时将会有些问题。该选项默认是打开的,但可以使用--skip-opt来关闭它。
(2)使用--skip-comments可以去掉导出文件中的注释语句
(3)使用--compact选项可以只输出最重要的语句,而不输出注释及删除表语句等等(4)使用--database或-B选项,可以转储多个数据库,在这个选项名后的参数都被认定为数据库名
SQLSERVER逻辑备份
我发现SQLSERVER的备份概念并没有ORACLE和MYSQL那么多 我们通常都会使用下面的两个SQL语句来备份SQLSERVER数据库,例如备份test库
BACKUP DATABASE test TO DISK='c:test.bak' BACKUP LOG test TO DISK='c:test_log.bak'
第一个SQL是完整备份test库,如果加上WITH DIFFERENTIAL就是差异备份 第二个SQL是备份test库的日志
实际上从我眼中的理解,SQLSERVER就是将数据文件和必要的日志信息放入一个压缩包里面,类似于MYSQL的物理备份,直接复制文件,只是MYSQL并没有进行打包压缩
SQLSERVER的逻辑备份
逻辑备份就是生成表定义脚本和数据插入脚本,SQLSERVER2008开始支持生成数据脚本,在SQLSERVER2008之前只支持生成表定义脚本 我所用的数据库是SQLSERVER2012 SP1 选中需要生成脚本的数据库
比如我要导出test表的数据和表定义
要选择架构和数据,并且要选择索引,这样就会生成表的数据、定义、索引
生成的脚本如下
USE [sss]GO/****** Object: Table [dbo].[test] Script Date: 2014/7/24 11:27:44 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[test]([a] [int] NULL)ON [PRIMARY]
GOINSERT [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 SettingsAll UserApplication DataMySQLMYSQL Server 5.6data 或者其他用户自定义的目录;
在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] 用mysql命令将school_2014-7-10.sql文件中的备份导入到数据库中 mysql-u root-h 127.0.0.1-p 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 connector连接mysql,来管理mysql并不是直接调用mysql.exe,所以执行source会报错 物理还原 2、直接复制到数据库目录 如果数据库通过复制数据库文件备份,可以直接复制备份文件到MYSQL数据目录下实现还原。通过这种方式还原时,必须保证备份数据的数据库和待还原的数据库服务器的主版本号相同。而且这种方式只对MYISAM引擎有效,对于innodb引擎的表不可用 执行还原以前关闭mysql服务,将备份的文件或目录覆盖mysql的data目录,启动mysql服务。 对于Linux操作系统来说,复制完文件需要将文件的用户和组更改为mysql运行的用户和组,通常用户是mysql,组也是mysql 3、mysqlhotcopy快速恢复 mysqlhotcopy备份后的文件也可以用来恢复数据库,在mysql服务器停止运行时,将备份的数据库文件复制到mysql存放数据的位置 (mysql的data文件夹),重新启动mysql服务即可。 如果根用户执行该操作,必须指定数据库文件的所有者,输入语句如下: chown-R mysql.mysql /var/lib/mysql/dbname 从mysqlhotcopy复制的备份恢复数据库 cp-R /usr/backup/test usr/local/mysql/data 执行完该语句,重启服务器,mysql将恢复到备份状态 注意:如果需要恢复的数据库已经存在,则在使用DROP语句删除已经存在的数据库之后,恢复才能成功。另外mysql不同版本之间必须兼容,恢复之后的数据才可以使用! 数据库迁移 数据库迁移就是把数据从一个系统移动到另一个系统上。迁移的一般原因: 1、需要安装新的数据库服务器 2、mysql版本更新 3、数据库管理系统变更(从SQLSERVER迁移到mysql) 相同版本的MYSQL数据库之间迁移 相同版本mysql数据库间的迁移就是主版本号相同的mysql数据库直接进行数据库移动。前面讲解备份和还原的时候,知道最简单的方法就是复制数据库文件目录,但是这种方法只适合于myisam表 对于innodb表,不能直接复制文件来备份数据库 最常用的方法是使用mysqldump导出数据,然后在目标数据库服务器使用mysql命令导入 将www.xiexiebang.com/2001/XMLSchema-instance“> 导入 1、使用LOAD DATA INFILE 方式导入文本文件 mysql允许将数据导出到外部文件,也可以从外部文件导入数据。 MYSQL提供了一些导入数据的工具,这些工具有:LOAD DATA语句、source命令、mysql命令 LOAD DATA INFILE语句用于高速地从一个文本文件中读取行,并装入一个表中。文件名称必须为文字字符串 语法如下: LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE tbl_name [FIELDS [TERMINATED BY 'string'] [[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char' ] ] [LINES [STARTING BY 'string'] [TERMINATED BY 'string'] ] [IGNORE number LINES] [(col_name_or_user_var,...)] [SET col_name = expr,...]] load data infile语句从一个文本文件中以很高的速度读入一个表中。使用这个命令之前,mysqld进程(服务)必须已经在运行。 当读取的文本文件不在本机,而是位于服务器上的文本文件时,使用load data infile语句,在服务器主机上你必须有file的权限。、如果你指定关键词low_priority,那么MySQL将会等到没有其他人读取这个表的时候,才插入数据。例如如下的命令: load data low_priority infile ”/home/mark/data.sql“ into table Orders;2、如果指定local关键词,则表明读取的文件在本机,那么必须指定local参数。3、replace和ignore参数控制对现有表的唯一键记录重复的处理。如果你指定replace,新行将代替有相同的唯一键值的现有行。 (1)如果你指定ignore,跳过有唯一键的现有行的重复行的输入。 (2)如果你不指定任何一个选项,当找到重复键时,出现一个错误,并且文本文件的余下部分被忽略。 FIELDS TERMINATED BY ','表示字段之间用逗号分隔 ENCLOSED BY '''表示每个字段用双引号括起来 ESCAPED BY '''表示将系统默认的转移字符替换为单引号 LINES STARTING BY ''表示每行数据开头的字符,可以为单个或多个,默认不是有任何字符 LINES TERMINATED BY 'rn'表示每行以回车换行符结尾,保证每一条记录占一行 [IGNORE number LINES] 选项表示忽略文件开始处的行数,number表示忽略的行数。 基本上格式上的参数跟SELECT...INTO OUTFILE是一样的 使用LOAD DATA命令将C:person0。txt文件中的数据导入到test库中的test表 LOAD DATA INFILE 'C:person0.txt' INTO TABLE test.person 先删除person表里的数据,然后执行LOAD DATA命令 使用mysqlimport命令导入文本文件 2、使用mysqlimport命令导入文本文件 mysqlimport是一个单独的exe,他提供了许多与LOAD DATA INFILE语句相同的功能 大多数选项直接对应LOAD DATA INFILE子句 mysqlimport的语法如下 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 [OPTIONS] 选项基本上与LOAD DATA INFILE 语句是一样的,这里不做介绍了 mysqlimport不能指定导入的表名称,表名称由导入文件名称确定,即文件名作为表名,导入数据之前该表必须存在 使用mysqlimport命令将C:目录下person.txt文件内容导入到test库 先删除test库的person表的数据 DELETE FROM `person`; person.txt文件内容 1 green 29 lawer2 suse 26 dancer3 evans 27 sports man4 mary 26 singer 命令如下 mysqlimport-u root-p test C:person.txt 导入成功 mysqlimport的常见选项: 显示帮助消息并退出。 ·--columns=column_list,-c column_list 该选项采用用逗号分隔的列名作为其值。列名的顺序指示如何匹配数据文件列和表列。 ·--compress,-C 压缩在客户端和服务器之间发送的所有信息(如果二者均支持压缩)。 ·---debug[=debug_options],-# [debug_options] 写调试日志。debug_options字符串通常是'd:t:o,file_name'。·--delete,-D 导入文本文件前清空表。 ·--fields-terminated-by=...,--fields-enclosed-by=...,--fields-optionally-enclosed-by=...,--fields-escaped-by=...,--lines-terminated-by=...这些选项与LOAD DATA INFILE相应子句的含义相同。参见13.2.5节,“LOAD DATA INFILE语法”。 ·--force,-f 忽视错误。例如,如果某个文本文件的表不存在,继续处理其它文件。不使用--force,如果表不存在则mysqlimport退出。 ·--host=host_name,-h host_name 将数据导入给定主机上的MySQL服务器。默认主机是localhost。 ·--ignore,-i 参见--replace选项的描述。·--ignore-lines=n 忽视数据文件的前n行。 ·--local,-L 从本地客户端读入输入文件。 ·--lock-tables,-l 处理文本文件前锁定所有表以便写入。这样可以确保所有表在服务器上保持同步。 ·--password[=password],-p[password] 当连接服务器时使用的密码。如果使用短选项形式(-p),选项和 密码之间不能有空格。如果在命令行中--password或-p选项后面没有 密码值,则提示输入一个密码。·--port=port_num,-P port_num 用于连接的TCP/IP端口号。 ·--protocol={TCP | SOCKET | PIPE | MEMORY} 使用的连接协议。 ·--replace,-r --replace和--ignore选项控制复制唯一键值已有记录的输入记录的处理。如果指定--replace,新行替换有相同的唯一键值的已有行。如果指定--ignore,复制已有的唯一键值的输入行被跳过。如果不指定这两个选项,当发现一个复制键值时会出现一个错误,并且忽视文本文件的剩余部分。·--silent,-s 沉默模式。只有出现错误时才输出。 ·--socket=path,-S path 当连接localhost时使用的套接字文件(为默认主机)。 ·--user=user_name,-u user_name 当连接服务器时MySQL使用的用户名。 ·--verbose,-v 冗长模式。打印出程序操作的详细信息。 ·--version,-V 显示版本信息并退出。 提示: LOAD DATA INFILE语句中有一个mysqlimport工具中没有特点: LOAD DATA INFILE 可以按指定的字段把文件导入到数据库中。当我们要把数据的一部分内容导入的时候,这个特点就很重要。 比方说,我们要从Access数据库升级到MySQL数据库的时候,需要加入一些字段(列/字 段/field)到MySQL数据库中,以适应一些额外的需要。 这个时候,我们的Access数据库中的数据仍然是可用的,但是因为这些数据的字段(field)与MySQL中的不再匹配,因此而无法再使用mysqlimport工具。 尽管如此,我们仍然可以使用LOAD DATA INFILE,下面的例子显示了如何向指定的字段(field)中导入数据: LOAD DATA INFILE ”/home/Order.txt" INTO TABLE Orders(Order_Number, Order_Date, Customer_ID); 如您所见,我们可以指定需要的字段(fields)。这些指定的字段依然是以括号括起,由逗号分隔的,如果您遗漏了其中任何一个,MySQL将会提醒您^_^ 如何选择备份工具? 直接复制数据文件是最为直接、快速的备份方法,但缺点是基本上不能实现增量备份。备份时必须确保没有使用这些表。如果在复制一个表的物理数据文件的同时服务器正在修改他,则复制无效。 备份文件时,最好关闭服务器,然后重新启动服务器,为了保证数据的一致性,需要在备份文件前执行以下SQL FLUSH TABLES WITH READ LOCK;也就是把内存中的数据刷新到磁盘中,同时锁定数据表,以保证复制过程中不会有新的数据写入。 这种方法备份出来的数据恢复很简单,直接复制回原来的数据库目录下即可 mysqlhotcopy是一个PERL程序,他使用LOCK TABLES、FLUSH TABLES和CP或SCP来快速备份数据库 他是备份数据库或单个表的最快的途径,但他只能运行在数据库文件所在机器上,并且mysqlhotcopy只能用于备份myisam表 mysqlhotcopy适合于小型数据库的备份,数据量不大,可以使用mysqlhotcopy程序每天进行一次完全备份 mysqldump将数据表导出为SQL脚本,在不同的MYSQL版本之间升级时相对比较合适,这也是最常用的备份方法。mysqldump比直接复制要慢些。 使用mysqldump备份整个数据库成功,把表和数据库删除了,但使用备份文件却不能恢复数据库? 出现这种情况是因为备份的时候没有指定--databases参数。默认情况下,如果只指定数据库名称,mysqldump 备份的是数据库中的所有表,而不包括数据库的创建语句,如下 mysqldump-u root-p booksdb >c:booksdb_2014-7-1.sql 该语句只备份了booksdb数据库下的所有表,读者打开该文件,可以看到文件中不包含创建booksdb数据库 的CREATE DATABASE语句,因此如果把booksdb也删除了,使用该sql文件不能还原以前的表,还原时会出现ERROR 1046(3D000):NO DATABASE SELECTED 的错误信息 而下面的语句,数据库删除之后,可以正常还原备份时的状态 mysqldump-u root-p--databases booksdb>C:booksdb_db_2014-7-1.sql 该语句不仅备份了所有数据库下的表结构,而且包括创建数据库的语句 MYSQL中的备份和还原,还有数据库的迁移,异构数据库之间的迁移基本上都用导出文件文件的方法 如果是小数据量尚可以,如果数据量比较大,导出文本文件也会很大,不是太可取