MySQL:
使用数据库的原因和其基本原理:
在没有数据库的情况下,当需要查询/etc/passwd文件中/bin/bash的用户名时,如果使用awk,sed等工具过滤必须首先将整个文件载入内存中,然后再进行筛选。但是如果这个文件有100G大,那么不仅I/O无法承受,且内存占用太多,检索时间也会过长。
所以,第一个需求就产生了:如果只将/etc/passwd每行的最后一个字段放到内存中进行检索,那么就会快很多。但是最后一个字段中的值只是用来做比较条件的,即使能够最快得到/bin/bash这个比较条件,最后还是需要回头去检索整个passwd文件寻找用户名。
所以,第二个需求产生了:如果在将passwd最后一个字段在内存中检索完成后的同时,也能够得到其行号也是极好的,这样就可以直接去取指定的行了。但是这样我们虽然可以最快的去寻找指定目标了,但是我们依然需要载入整个文件。
所以,第三个需求产生了:如果只载入指定的行到内存那么将是多么的美好。我们知道数据都是存在数据块上,然后数据块在分散的存在不同磁盘块上面。而如果我们将passwd按照行进行分割,然后存放到不同的数据块上面。比如1-10行放在第一个数据块上面,11-20行放到第二个数据块上面。那么我们就可以在检索时只载入我们需要的块,而不必载入整个文件了。
总结,上面第一个需求,就是我们的“一级索引”,也就是我们经常作为查找条件的字段/bin/bash(列)单独提取到一个文件中,然后写上对应的行号,再写上这一行在哪个数据块上面,这样我们在查找时,就可以先找"一级索引"/bin/bash,再找根据对应的数据块编号载入指定的数据块,最后我们再根据行号载入指定的字段name了。
二级索引:当passwd有100TB时,那么一级索引的量可能会有100G,这时就需要而进行二级索引,三级索引了。
稠密索引:属于二级索引往后的索引,也就是每个一级索引建立一个条目到一个文件,同时也记录其行号、数据块编号、上级索引条目名称。
稀疏索引:相对于稠密索引,它是每隔多少一级索引建一个条目录,不如当第一个稠密索引的对应的一级索引为ID号为1时,那么稀疏索引就是建立第二个稠密索引并对应一级索引ID号为100.所以稀疏索引只是一个范围。
这样,就是几个基本的数据库模型了。
数据模型:
层次模型:类似linux的目录结构,只能竖向查看当前目录下的所有内容。
无法很像查看其它目录下的内容
网状模型:加上了横向查看功能,但当数据变化时,整个结构变化很复杂,不易于管理
关系模型:类似于定义好列名和行名的表。codd发明,使得竖向和横向都能查看。
数据库管理系统(DBMS)设计目标:
1、数据的冗余和不一致。
2、数据访问困难:当数据量很大时。
3、数据孤立:由于数据量很大时,需要放在单独小文件中。
4、完整性问题:数据库中的值要满足一定的约束条件。
比如人的年龄要大于0而小于150。
银行账户只有100元,而取钱时,不能取走200元。
5、原子性问题:在jerry给tom进行银行转账时,jerry账户减去1000元的同时,
tom账户也必须增加1000元。但是就在jerry账户已经被扣除1000元后,
服务器突然断电,那么服务器必须进行回滚,也就是给jerry再增加1000元。
6、并发访问问题:在进程读取文件时,会给文件加上一个读锁,但是读锁可以共享给别的进程
在进程写入文件时,给给文件加不可共享的写锁。
7、安全性问题:在文件系统层面上,用户的权限只能限制在整个文件上。而不能具体到行。
DBMS:
物理层:将数据存储到磁盘块上。
逻辑层:将数据存储为表。
视图层:给用户进行授权,让用户进入服务器后,能够看到指定表的哪几行。
存储引擎:
将逻辑层操作转换为物理层写入到磁盘块上。
数据库的安全:
认证:决定用户能否进入数据库服务器
授权:当用户进入数据库服务器后,是否具有对具体数据库的访问权限
审计:记录 得到授权的用户 是否有滥用权限的行为,常用手段是日志。
而mysql为了安全,不能与web服务器一样一个进程响应多个请求。而是使用类似prework的线程池
mysql的数据写入步骤:
磁盘的顺序读写时,性能才是最好的。但期望是美好,现实是残酷的,我们不可能将所有的表数据按照磁盘块的顺序进行存放。但我们为了提高mysql性能,可以先不往数据库文件中写入数据,但是这样数据就会暂存在内存中,万一发生宕机,后果你懂得。。。
所以我们取了一个折中的方法,只要你的SQL语句(便于理解,事务)一提交,那么我们立即将你的SQL语句同步到一个具有连续磁盘块空间的文件,当然,这个磁盘必须是独立于数据库文件存放磁盘的(在单磁盘的情况下,而非RAID)。然后这个文件再异步的将SQL语句放到数据库文件上逐个执行一遍,这样就可以大大的提高效率了。这个文件就叫做事务日志文件,它是只能追加,不能删除的文件。而且事务日志文件有2个,当第一个写满时,就写第二个,然后第一个开始同步到数据库文件。当然,它有更复杂的工作机制!
既然,事务日志这么好,我们能不能将此文件大小设的高些呢?
但是如果我们在将SQL语句写入了事务日志后,还没有来的及同步到数据库文件中执行,就宕机了,那么我们在下次开机时,就会自动的将事务日志同步到数据库文件中执行一遍。注意,这个过程是数据库自动执行的,不能手工干预的,也就是如果我们在start mysql时,如果发现一直不能出现OK,那么就是在同步事务日志,如果我们CTRL+C了,那么极有可能丢失事务日志中的全部操作。所以当事务日志文件越大,存的SQL语句越多,那么开机恢复时间也就越长。所以为了保险起见,我们不能将事务日志文件设定过大。默认文件大小为5M。
但是一个事务特别大(应该可以理解为SQL语句特别长,执行步骤特别多吧!!),当正在到数据库文件中同步到一半时,就宕机了,那么开机后就会回滚,然后重新同步。所以为了预防万一,尽量将语句写的短些吧!
另外,如果一组DML语句(数据库操作语言,主要用来操作数据库数据的。而且在mysql中,一般事务指的是DML语句)在事务日志中写好自己的SQL语句了,但是还没有同步到数据库文件中,但紧接着的下一个事务就需要查询上一个操作的完成情况,这时我们的事务日志必须还能够生成一个视图让下一个操作进行查询。
事务日志名称:ib_logfile0、ib_logfile1
ACID:
数据一致性:转账前后,双方的总钱数要一致。
持久性:当整个转账操作在内存完成后,磁盘上的数据库状态一定是改变的。
持久性越严格,就越会影响性能。
原子性:这一组DML要么都执行,要么都不执行。当同步事务日志的一半内容到数据库时便断电的情况
隔离性:转账的同时,用户不能进行取款操作。
事物:
ACID,就是将某些单独的操作视为一个整体的操作,使得要么都执行成功,要么都不执行。
CRUD:
create增、Retrieve查、update改、delete删
上面这个图是mysql数据库的一个基本框架:
API接口:
当程序(不只是mysql数据库)要将自己的功能提供给别人使用时,就需要程序提供一个可以访问的接口,而API接口就是其中之一,但是调用程序的人必须使用程序已有的API接口语言进行调用。比如你只懂PHP语言,那么你必须给mysql服务器装上php-mysql包,这个包就是php的API接口包,使得PHP能够访问mysql。这个php-mysql也就是相当于mysql数据库系统的php语言驱动程序,也叫做连接器。
php-mysql将我们需要用到东西封装一个个的函数,比如我们只需要使用一个mysql_connect()这个函数便可以调用数据库。比如你可以在论坛程序的配置文件中看到这么一句“$link=mysql_connect(localhost,user_name,'user_pwd');”
注意,这里用PHP语言开发出来的程序叫做客户端,而php-mysql连接器可以叫做这个客户端的服务器程序。
到了PHP5以后,PDO这个高级连接器便出现了,使得php能够以数据库对象的方式与mysql服务器进行交互。
但是如果有很多人需要调用数据库,他们使用的语言各不相同,怎么办?
而且有的时候,作为一个普通的系统管理员,也需要去管理数据库,但不会各种语言,怎么办?
ODBC接口:
它是mysql数据库非常底层的一个对外接口,它能够被所有的语言调用,而不再需要专用的语言驱动。但是愈是底层的东西,开发周期越长,这样又不利于工作。
sql接口:
在万众期待下,ANSI,美国国家标准委员会提出了一个sql数据库标准,。这大大提高了开发效率,也方便了系统管理。
同时sql标准有sql-86,sql-92、sql-99、sql-03分别表示不同的年份标准。
sql接口的客户端可以是mysql,而在mysql服务器上的sql接口叫做其客户端。
"查询求解引擎"包含以下组件,它决定了数据库的性能:
分 析 器:第一个功能,它使用空格将sql语句进行切片,然后分析出那些是关键字,哪些是查询条件,哪些是数据库对象,然后对整个语句进行语法分析,判断语句语法正确与否。
第二个功能,sql语句第一次查询时首先查询就是缓存。但第一次缓存未命中时,就交到分析器,分析器发现还能命中,就再次交到缓存中查询。如果仍然没有命中就会交到优化器中。
操作求解器:对用户的请求进行计算,查询那种方式能够完成要求
查询 计划:根据操作求解器 的计算结果,选择一个最合适的方式
优 化 器:分析sql语句,发现修改sql语句后可以变得更快,就修改。
分析是否能够使用索引。
分析查询代价。
缓冲管理器:
为了提高查询速度,mysql会将索引等提前加载到内存,或者将查询过的内容缓存下来
磁盘空间管理器:控制文件是如何进行存储数据的,这里就是存储引擎的发挥作用的地方了,也就是将逻辑层操作转换为物理层。
事物管理器:
保证ACID的四个特性
锁:
锁是为了保证一致性的,用来控制并发的。
恢复管理器:
在转账操作已经在内存中完成,需要写入日志时,由于一个事物的操作步骤特别多,比如有100个步骤,到了99个断电了,那么在重启后就需要回滚。
数据文件、索引文件:
索引相当于linux系统的目录,以提高查询速率。
由于搜索标准的不同,索引文件也不同,所以有一个主索引,多个辅助索引。
MySQL的下载:
http://www.mysql.com/downloads/ → MySQL Community Edition(GPL)最下面 → http://dev.mysql.com/downloads/ → MySQL Community Server (GPL) 最上面 → http://dev.mysql.com/downloads/mysql/ → Select Platform:
下载首页:
Download GA Current Downloads (Generally Available):
公共可用的程序包
MySQL Enterprise Edition (commercial)
收费版mysql
MySQL Cluster CGE (commercial)
收费的
MySQL Community Edition (GPL)
遵循GPL开源规定免费版,在这里点击进去
免费版下载首页:
MySQL Community Server (GPL)
这是客户端和服务器端组合起来的核心包,点击进去
MySQL Cluster (GPL)
集群包,很少用
MySQL Workbench (GPL)
辅助设计mysql数据库的,少用
MySQL Utilities (GPL)
管理工具组件,用于管理和维护,又时用到
MySQL Proxy (GPL)
代理,有用
MySQL Connectors
连接mysql的语言驱动,比如php-mysql一类
MySQL on Windows (Installer & Tools)
微软系统用的工具等
MySQL Benchmark Tool
压力测试工具
Mirrors 选择离自己比较近的镜像进行下载比如搜狐镜像源就包含mysql目录
免费版client+server核心包下载页:(选择平台时也会遇到很多疑惑的了)
RHEL/ORACLE LINUX :
RPM Bundle这是rpm格式的包,一个包就包含了所有内容。而下面则是分割开来的。
linux generic:
后面的rpm对系统没有要求,只要能安装rpm,无论suse都可以安装
Linux - Generic (glibc 2.5) (x86, 64-bit), Compressed TAR Archive
这里是我们需要的二进制格式的归档压缩包
下面是二进制包的简单安装步骤:
# mkdir /data/mydata 数据库文件的存放位置,一般是独立于操作系统。而且线上的操作系统根大小一般都是10G。 # useradd -r mysql # chown -R mysql.mysql /data/mydata mysql用户必须对数据库目录有绝对的读写权限 # tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local/ 一般都是解压到/usr/local/ # ln -s /usr/local/mysql-5.5.33-linux2.6-x86_64/ /usr/local/mysql 软连接必须是/usr/local/mysql路径,因为启动脚本mysqld就是这么指定的。 # chown -R root.mysql /usr/local/mysql/* 这里修改mysql目录下的所有文件,而mysql这个软连接不用改。 而且如果想使用/usr/local/mysql/data作为目录其属主、属组都要改为mysq # service mysqld stop 停掉原来的mysql服务器,如果有! # mv /etc/rc.d/init.d/mysqld{,.bak} # cp /usr/loca/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld # mv /etc/my.cnf{,.bak} 先备份原来的配置文件,线上环境这是必须的! # cp my-large.cnf /etc/my.cnf large表示内存大于512M huge表示内存大于1G # vim /etc/my.cnf [mysqld] thread_concurrency = 8 改为自己的物理核心数 datadir = /data/mydata 数据库目录, socket = /tmp/mysql.sock socket是进程间通信的文件,有些程序使用数据库时默认会 调用/var/lib/mysql/mysql.sock 这个文件件。所以可以做一个软连接。 这种方式理论上比TCP/IP的方式性能好,但仅仅是理论。 # echo "export PATH=/usr/local/mysql/bin/:$PATH" > /etc/profile.d/mysql.sh # . /etc/profile.d/mysql.sh 修改mysql的执行PATH为自己的,可以执行mysql命令退出后,使用hash命令看到 #vim /etc/man.config MANPATH /usr/local/mysql/man 添加自定义man手册的位置。指定到man即可,不要指定man8 # ln -sv /usr/local/mysql/include/ /usr/include/mysql 导出库文件 # vim /etc/ld.so.conf.d/mysql.conf /usr/local/mysql/lib 连接头文件,这是指导系统如果调用库的说明书 # ldconfig -v | grep mysql 重新生成缓存并显示过程,其中包含带有18字样的标识。 基本安装完成。 |
1 | <span style= "font-family:'黑体', SimHei;" ><br>< /span > |
MySQL:作者二女儿的名字,2008年被Oracle公司收购,然后商业版价格翻四倍,但承诺开源5年。
MariaDB:作者三女儿的名字。
PostgreSQL:发行较晚的成熟数据库
Percona:黑客团队percona优化后的mysql,功能比mysql强大。后期会经常用到其研发的工具。
PHP简介:
PHP是通用服务器端脚本编程语言,其主要用于web开发以实现动态web页面,它也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时,php还提供了一个命令行接口,因此,其也可以在大多数系统上作为一个独立的shell来使用
Rasmus Lerdorf于1994年开始开发PHP,它是初是一组被Rasmus Lerdorf称作“Personal Home Page Tool” 的Perl脚本, 用一个脚本写另一个脚本。
这些脚本可以用于显示作者的简历并记录用户对其网站的访问。后来,Rasmus Lerdorf使用C语言将这些Perl脚本重写为CGI程序,还为其增加了运行Web forms的能力以及与数据库交互的特性,并将其重命名为“Personal Home Page/Forms Interpreter”或“PHP/FI”。此时,PHP/FI已经可以用于开发简单的动态web程序了,这即是PHP 1.0。1995年6月,Rasmus Lerdorf把它的PHP发布于comp.infosystems.www.authoring.cgi Usenet讨论组,从此PHP开始走进人们的视野。1997年,其2.0版本发布。
1997年,两名以色列程序员Zeev Suraski和Andi Gutmans重写的PHP的分析器(parser)成为PHP发展到3.0的基础,而且从此将PHP重命名为PHP: Hypertext Preprocessor。此后,这两名程序员开始重写整个PHP核心,并于1999年发布了Zend Engine 1.0,这也意味着PHP 4.0的诞生。2004年7月,Zend Engine 2.0发布,由此也将PHP带入了PHP5时代。PHP5包含了许多重要的新特性,如增强的面向对象编程的支持、支持PDO(PHP Data Objects)扩展机制以及一系列对PHP性能的改进。
二、PHP Zend Engine
Zend Engine是开源的、PHP脚本语言的解释器,它最早是由以色列理工学院(Technion)的学生Andi Gutmans和Zeev Suraski所开发,Zend也正是此二人名字的合称。后来两人联合创立了Zend Technologies公司。
Zend Engine 1.0于1999年随PHP 4发布,由C语言开发且经过高度优化,并能够做为PHP的后端模块使用。Zend Engine为PHP提供了内存和资源管理的功能以及其它的一些标准服务,其高性能、可靠性和可扩展性在促进PHP成为一种流行的语言方面发挥了重要作用。
Zend Engine的出现将PHP代码的处理过程分成了两个阶段:首先是分析PHP代码并将其转换为称作Zend opcode的二进制格式(类似Java的字节码),并将其存储于内存中;第二阶段是使用Zend Engine去执行这些转换后的Opcode。
三、PHP的Opcode
Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL。PHP执行PHP脚本代码一般会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend):
1、Scanning(Lexing) —— 将PHP代码转换为语言片段(Tokens)
2、Parsing —— 将Tokens转换成简单而有意义的表达式
3、Compilation —— 将表达式编译成Opocdes
4、Execution —— 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能
四、php的加速器:提高php的执行
基于PHP的特殊扩展机制如opcode缓存扩展也可以将opcode缓存于php的共享内存中,从而可以让同一段代码的后续重复执行时跳过编译阶段以提高性能。由此也可以看出,这些加速器并非真正提高了opcode的运行速度,而仅是通过分析opcode后并将它们重新排列以达到快速执行的目的。
常见的php加速器有:以php解释器的模块存在
1、APC (Alternative PHP Cache)
遵循PHP License的开源框架,PHP opcode缓存加速器,目前的版本不适用于PHP 5.4。项目地址,http://pecl.php.net/package/APC。
2、eAccelerator
源于Turck MMCache,早期的版本包含了一个PHP encoder和PHP loader,目前encoder已经不在支持。项目地址, http://eaccelerator.net/。
3、XCache,
快速而且稳定的PHP opcode缓存,经过严格测试且被大量用于生产环境。项目地址,http://xcache.lighttpd.net/
4、Zend Optimizer和Zend Guard Loader
Zend Optimizer并非一个opcode加速器,它是由Zend Technologies为PHP5.2及以前的版本提供的一个免费、闭源的PHP扩展,其能够运行由Zend Guard生成的加密的PHP代码或模糊代码。 而Zend Guard Loader则是专为PHP5.3提供的类似于Zend Optimizer功能的扩展。项目地址,http://www.zend.com/en/products/guard/runtime-decoders
5、NuSphere PhpExpress
NuSphere的一款开源PHP加速器,它支持装载通过NuSphere PHP Encoder编码的PHP程序文件,并能够实现对常规PHP文件的执行加速。项目地址,http://www.nusphere.com/products/phpexpress.htm
php.ini官方文档:
配置参数:http://www.php.net/manual/zh/ini.list.php
核心配置参数详解:http://www.php.net/manual/zh/ini.core.php
# yum list all *php*
php.x86_64 5.3.3-22.el6 主包,默认以模块安装CGI。
php-mysql.x86_64 5.3.3-22.el6 与mysql相连的语言驱动
php-common.x86_64 5.3.3-22.el6 必需包
php-cli.x86_64 5.3.3-22.el6 必需包,客户端工具
php-gd.x86_64 5.3.3-22.el6 绘图专用,在使用图形监控工具时会用到
php-odbc.x86_64 5.3.3-22.el6 与各种数据库连接时使用的ODBC接口工具
yum方法安装php:
# yum install php
配置文件:
/etc/php.ini 主配置文件
/etc/httpd/conf.d/php.conf 与RPM包安装的httpd协同工作的额外的配置文件。
1 | <span ><IfModule prefork.c>如果httpd以prefork工作,就装载这个模块<br> LoadModule php5_module modules/libphp5.so<br></IfModule><br><IfModule worker.c>以非独立的线程方式工作<br> LoadModule php5_module modules/libphp5-zts.so<br></IfModule><br></span> |
php语言的格式:
1 | <span style= "font-family:'黑体', SimHei;" ><html><br> <title>浏览器标签页标题</title><br> <body><br> <h1>一级标题</h1><br> <?php phpinfo(); ?>这里才是php解释器执行的部分,其他的不执行。phpinfo()是php自身的一个测试函数<br> </body><br></html><br></span> |
配置httpd的主配置文件:
Directory index.php
只需要增加这一点即可。不用增加与编译安装一样的其他的类型