当前位置首页 > 百科> 正文

MySQL资料库

2019-07-23 17:01:29 百科
MySQL资料库

MySQL资料库

MySQL是一种开放原始码的关係型资料库管理系统(RDBMS),使用最常用的资料库管理语言--结构化查询语言(SQL)进行资料库管理。

MySQL是开放原始码的,因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。

MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。

基本介绍

  • 中文名:MySQL资料库
  • 类型:开放原始码的关係型
  • 说明:资料库管理系统
  • 标誌:sakila

资料库简介

MySQL是一种开放原始码的关係型资料库管理系统(RDBMS),MySQL资料库系统使用最常用的资料库管理语言--结构化查询语言(SQL)进行资料库管理。
由于MySQL是开放原始码的,因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。
MySQL这个名字,起源不是很明确。一个比较有影响的说法是,基本指南和大量的库和工具带有前缀“my”已经有10年以上,而且不管怎样,MySQL AB创始人之一的Monty Widenius的女儿也叫My。这两个到底是哪一个给出了MySQL这个名字至今依然是个迷,包括开发者在内也不知道。
MySQL的海豚标誌的名字叫“sakila”,它是由MySQL AB的创始人从用户在“海豚命名”的竞赛中建议的大量的名字表中选出的。获胜的名字是由来自非洲史瓦济兰的开源软体开发者Ambrose Twebaze提供。根据Ambrose所说,Sakila来自一种叫SiSwati的史瓦济兰方言,也是在Ambrose的家乡乌干达附近的坦尚尼亚的Arusha的一个小镇的名字。
MySQL,虽然功能未必很强大,但因为它的开源、广泛传播,导致很多人都了解到这个资料库。它的历史也富有传奇性。

历史

MySQL的历史最早可以追溯到1979年,那时Oracle也才小打小闹,微软的SQL Server影子都没有。有一个人叫Monty Widenius, 为一个叫TcX的小公司打工,并用BASIC设计了一个报表工具,可以在4M主频和16KB记忆体的计算机上运行。过了不久,又将此工具,使用C语言重写,移植到Unix平台,当时,它只是一个很底层的面向报表的存储引擎。这个工具叫做Unireg。
可是,这个小公司资源有限,Monty天赋极高,面对资源有限的不利条件,他反而更能发挥潜能,总是力图写出最高效的代码。并因此养成了习惯。与Monty同在一起的还有一些别的同事,很少有人能坚持把那些代码持续写到20年后,而Monty却做到了。
1990年,TcX的customer 中开始有人要求要为它的API提供SQL支持,当时,有人想到了直接使用商用资料库算了,但是Monty觉得商用资料库的速度难令人满意。于是,他直接藉助于mSQL的代码,将它集成到自己的存储引擎中。但不巧的是,效果并不太好。于是, Monty雄心大起,决心自己重写一个SQL支持。
1996年,MySQL 1.0发布,只面向一小拨人,相当于内部发布。到了96年10月,MySQL 3.11.1发布了,呵呵,没有2.x版本。最开始,只提供了Solaris下的二进制版本。一个月后,Linux版本出现了。
紧接下来的两年里,MySQL依次移植到各个平台下。它发布时,採用的许可策略,有些与众不同:允许免费商用,但是不能将MySQL与自己的产品绑定在一起发布。如果想一起发布,就必须使用特殊许可,意味着要花银子。当然,商业支持也是需要花银子的。其它的,随用户怎幺用都可以。这种特殊许可为MySQL带来了一些收入,从而为它的持续发展打下了良好的基础。(细想想,PostgreSQL曾经有几年限入低谷,可能与它的完全免费,不受任何限制有关係)。
MySQL3.22应该是一个标誌性的版本,提供了基本的SQL支持。
MySQL关係型资料库于1998年1月发行第一个版本。它使用系统核心提供的多执行绪机制提供完全的多执行绪运行模式,提供了面向C、C++、Eiffel、Java、Perl、PHP、Python以及Tcl等程式语言的编程接口(APIs),支持多种栏位类型并且提供了完整的操作符支持查询中的SELECT和WHERE操作。
MySQL是开放原始码的,因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。
1999-2000年,有一家公司在瑞典成立了,叫MySQL AB (AB是瑞典语“股份公司”的意思)。 雇了几个人,与Sleepycat合作,开发出了 Berkeley DB引擎, 因为BDB支持事务处理,所以,MySQL从此开始支持事务处理了。
2000年4月,MySQL对旧的存储引擎进行了整理,命名为MyISAM。同时,2001年,Heikiki Tuuri向MySQL提出建议,希望能集成他们的存储引擎InnoDB,这个引擎同样支持事务处理,还支持行级锁。
如今,遗憾的是,BDB和InnoDB好像都被Oracle收购了,为了消灭竞争对手,哪怕是开源的,都是不择手段。
MySQL与InnoDB的正式结合版本是4.0。
到了MySQL5.0,2003年12月,开始有View,存储过程之类的东东,当然,其间, bug也挺多。
在2008年1月16号 MySQL被Sun公司收购。
最近,MySQL的创始人Monty Widenius已经向Sun提交了辞呈。head都要走了。
据说,被Sun收购的公司多薄命,不知道MySQL今后前途如何,希望一路走好。相信MySQL的生命力还是很长久的。
时至今日 mysql 和 php 的结合绝对是完美.很多大型的网站也用到mysql资料库.mysql的发展前景是非常光明的!

常用命令

1:使用SHOW语句找出在伺服器上当前存在什幺资料库:
mysql> SHOW DATABASES;
2:创建一个资料库MYSQLDATA
mysql> CREATE DATABASE MYSQLDATA;
3:选择你所创建的资料库
mysql> USE MYSQLDATA; (按回车键出现Database changed 时说明操作成功!)
4:查看现在的资料库中存在什幺表
mysql> SHOW TABLES;
5:创建一个资料库表
mysql> CREATE TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));
6:显示錶的结构:
mysql> DESCRIBE MYTABLE;
7:往表中加入记录
mysql> insert into MYTABLE values (”hyq”,”M”);
8:用文本方式将数据装入资料库表中(例如D:/mysql.txt)
mysql> LOAD DATA LOCAL INFILE “D:/mysql.txt” INTO TABLE MYTABLE;
9:导入.sql档案命令(例如D:/mysql.sql)
mysql>use database;
mysql>source d:/mysql.sql;
10:删除表
mysql>drop TABLE MYTABLE;
11:清空表
mysql>delete from MYTABLE;
12:更新表中数据
mysql>update MYTABLE set sex=”f” where name=’hyq’;
全局管理许可权对应解释:
FILE: 在MySQL伺服器上读写档案。
PROCESS: 显示或杀死属于其它用户的服务执行绪。
RELOAD: 重载访问控制表,刷新日誌等。
SHUTDOWN: 关闭MySQL服务。
资料库/数据表/数据列许可权:
ALTER: 修改已存在的数据表(例如增加/删除列)和索引。
CREATE: 建立新的资料库或数据表。
DELETE: 删除表的记录。
DROP: 删除数据表或资料库。
INDEX: 建立或删除索引。
INSERT: 增加表的记录。
SELECT: 显示/搜寻表的记录。
UPDATE: 修改表中已存在的记录。
特别的许可权:
ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录–其它什幺也不允许做。

资料库导入

MySQL资料库的导入,有两种方法:
1) 先导出资料库SQL脚本,再导入;
2) 直接拷贝资料库目录和档案。
在不同作业系统或MySQL版本情况下,直接拷贝档案的方法可能会有不兼容的情况发生。
所以一般推荐用SQL脚本形式导入。下面分别介绍两种方法。
2. 方法一 SQL脚本形式
操作步骤如下:
2.1. 导出SQL脚本
在原资料库伺服器上,可以用phpMyAdmin工具,或者mysqldump命令行,导出SQL脚本。
2.1.1 用phpMyAdmin工具
导出选项中,选择导出“结构”和“数据”,不要添加“DROP DATABASE”和“DROP TABLE”选项。
选中“另外储存为档案”选项,如果数据比较多,可以选中“gzipped”选项。
将导出的SQL档案保存下来。
2.1.2 用mysqldump命令行
命令格式
mysqldump -u 用户名 -p 资料库名 > 资料库名.sql
範例:
mysqldump -u root -p abc > abc.sql
(导出资料库abc到abc.sql档案)
提示输入密码时,输入该资料库用户名的密码。
2.2. 创建空的资料库
通过主控界面/控制台,创建一个资料库。假设资料库名为abc,资料库全权用户为abc_f。
2.3. 将SQL脚本导入执行
同样是两种方法,一种用phpMyAdmin(mysql资料库管理)工具,或者mysql命令行。
2.3.1 用phpMyAdmin工具
从控制台,选择创建的空资料库,点“管理”,进入管理工具页面。
在"SQL"选单中,浏览选择刚才导出的SQL档案,点击“执行”以上载并执行。
注意:phpMyAdmin对上载的档案大小有限制,php本身对上载档案大小也有限制,如果原始sql档案
比较大,可以先用gzip对它进行压缩,对于sql档案这样的文本档案,可获得1:5或更高的压缩率。
gzip使用方法:
# gzip xxxxx.sql
得到
xxxxx.sql.gz档案。
提示输入密码时,输入该资料库用户名的密码。
3 直接拷贝
如果资料库比较大,可以考虑用直接拷贝的方法,但不同版本和作业系统之间可能不兼容,要慎用。
3.1 準备原始档案
用tar打包为一个档案
3.2 创建空资料库
3.3 解压
在临时目录中解压,如:
cd /tmp
tar zxf mydb.tar.gz
3.4 拷贝
将解压后的资料库档案拷贝到相关目录
cd mydb/
cp * /var/lib/mysql/mydb/
对于FreeBSD:
cp * /var/db/mysql/mydb/
3.5 许可权设定
将拷贝过去的档案的属主改为mysql:mysql,许可权改为660
chown mysql:mysql /var/lib/mysql/mydb/*
chmod 660 /var/lib/mysql/mydb/*
Mssql转换mysql的方法
1.导表结构
使用MySQL生成create脚本的方法。找到生成要导出的脚本,按MySQL的语法修改一下到MySQL资料库中创建该表的列结构什幺的。
2.导表数据
在MSSQL端使用bcp导出文本档案:
bcp “Select * FROM dbname.dbo.tablename;” queryout tablename.txt -c -Slocalhost\db2005 -Usa
其中”"中是要导出的sql语句,-c指定使用\t进行栏位分隔,使用\n进行记录分隔,-S指定资料库伺服器及实例,-U指定用户名,-P指定密码.
在MySQL端使用mysqlimport 导入文本档案到相应表中
mysqlimport -uroot -p databasename /home/test/tablename.txt
其中-u指定用户名,-p指定密码,databasename指定资料库名称,表名与档案名称相同

备份与恢复

MySQL备份恢複数据的一般步骤
备份一个资料库的例子:
1、备份前读锁定涉及的表
mysql>LOCK TABLES tbl1 READ,tbl1 READ,…
如果,你在mysqldump实用程式中使用--lock-tables选项则不必使用如上SQL语句。
2、导出资料库中表的结构和数据
shell>mysqldump --opt db_name>db_name.sql
3、启用新的更新日誌
shell>mysqladmin flush-logs
这样可以记录你备份后的数据改变为恢複数据準备。
4、解除表的读锁
mysql>UNLOCK TABLES;
为了加速上述过程,你可以这样做:
shell> mysqldump --lock-tables --opt db_name>db_name.sql; mysqladmin flush-logs
但是这样可能会有点小问题。上命令在启用新的更新日誌前就恢复表的读锁,
在更新繁忙的站点,可能有备份后的更新数据没有记录在新的日誌中。
现在恢复上面备份的资料库
1、对涉及的表使用写锁
mysql>LOCK TABLES tbl1 WRITE,tbl1 WRITE,…
2、恢复备份的数据
shell>mysql db_name < db_name.sql
3、恢复更新日誌的内容
shell>mysql --one-database db_name < hostname.nnn
假设需要使用的日誌名字为hostname.nnn
4、启用新的更新日誌
shell>mysqladmin flush-logs
5、解除表的写锁
mysql>UNLOCK TABLES;
希望上面的例子能给你启发,因为备份数据的手法多种多样,你所使用的和上面所述可能大不一样,但是对于备份和恢复中,表的锁定、启用新的更新日誌的时机应该是类似的,仔细考虑这个问题。

资料库最佳化

选择InnoDB作为存储引擎
大型产品的资料库对于可靠性和并发性的要求较高,InnoDB作为默认的MySQL存储引擎,相对于MyISAM来说是个更佳的选择。
最佳化资料库结构
组织资料库的schema、表和栏位以降低I/O的开销,将相关项保存在一起,并提前规划,以便随着数据量的增长,性能可以保持较高的水平。
设计数据表应儘量使其占用的空间最小化,表的主键应儘可能短。·对于InnoDB表,主键所在的列在每个辅助索引条目中都是可複製的,因此如果有很多辅助索引,那幺一个短的主键可以节省大量空间。
仅创建你需要改进查询性能的索引。索引有助于检索,但是会增加插入和更新操作的执行时间。
InnoDB的ChangeBuffering特性
InnoDB提供了changebuffering的配置,可减少维护辅助索引所需的磁碟I/O。大规模的资料库可能会遇到大量的表操作和大量的I/O,以保证辅助索引保持最新。当相关页面不在缓冲池里面时,InnoDB的changebuffer将会更改快取到辅助索引条目,从而避免因不能立即从磁碟读取页面而导致耗时的I/O操作。当页面被载入到缓冲池时,缓冲的更改将被合併,更新的页面之后会刷新到磁碟。这样做可提高性能,适用于MySQL5.5及更高版本。
InnoDB页面压缩
InnoDB支持对表进行页面级的压缩。当写入数据页的时候,会有特定的压缩算法对其进行压缩。压缩后的数据会写入磁碟,其打孔机制会释放页面末尾的空块。如果压缩失败,数据会按原样写入。表和索引都会被压缩,因为索引通常是资料库总大小中占比很大的一部分,压缩可以显着节约记忆体,I/O或处理时间,这样就达到了提高性能和伸缩性的目的。它还可以减少记忆体和磁碟之间传输的数据量。MySQL5.1及更高版本支持该功能。
注意,页面压缩并不能支持共享表空间中的表。共享表空间包括系统表空间、临时表空间和常规表空间。
使用批量数据导入
在主键上使用已排序的数据源进行批量数据的导入可加快数据插入的过程。否则,可能需要在其他行之间插入行以维护排序,这会导致磁碟I/O变高,进而影响性能,增加页的拆分。关闭自动提交的模式也是有好处的,因为它会为每个插入执行日誌刷新到磁碟。在批量插入期间临时转移唯一键和外键检查也可显着降低磁碟I/O。对于新建的表,最好的做法是在批量导入后创建外键/唯一键约束。
一旦你的数据达到稳定的大小,或者增长的表增加了几十或几百兆位元组,就应该考虑使用OPTIMIZETABLE语句重新组织表并压缩浪费的空间。对重新组织后的表进行全表扫描所需要的I/O会更少。
最佳化InnoDB磁碟I/O
增加InnoDB缓冲池大小可以让查询从缓冲池访问而不是通过磁碟I/O访问。通过调整系统变数innodb_flush_method来调整清除缓冲的指标使其达到最佳水平。
MySQL的记忆体分配
在为MySQL分配足够的记忆体之前,请考虑不同领域对MySQL的记忆体需求。要考虑的关键领域是:并发连线——对于大量并发连线,排序和临时表将需要大量记忆体。在撰写本文时,对于处理3000+并发连线的资料库,16GB到32GB的RAM是足够的。
记忆体碎片可以消耗大约10%或更多的记忆体。像innodb_buffer_pool_size、key_buffer_size、query_cache_size等快取和缓冲区要消耗大约80%的已分配记忆体。
日常维护
定期检查慢的查询日誌并最佳化查询机制以有效使用快取来减少磁碟I/O。最佳化它们,以扫描最少的行数,而不是进行全表扫描。
其他可以帮助DBA检查和分析性能的日誌包括:错误日誌、常规查询日誌、二进制日誌、DDL日誌(元数据日誌)。
定期刷新快取和缓冲区以降低碎片化。使用OPTIMIZETABLE语句重新组织表并压缩任何可能被浪费的空间。
声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:baisebaisebaise@yeah.net