公布Mysql数据库的平安设置、有用技能
甚至一个有经验的Windows管理者也可以轻松部署并开始学习它,而你不需投入一分钱来了解这个数据库。1、媒介MySQL是完整收集化的跨平台干系型数据库体系,同时是具有客户机/服务器系统布局的散布式数据库办理体系。它具有功效强、利用烦琐、办理便利、运转速率快、平安牢靠性强等长处,用户可使用很多言语编写会见MySQL数据库的程序,出格是与php更是黄金组合,使用非常普遍。
因为MySQL是多平台的数据库,它的默许设置要思索各类情形下都能合用,以是在我们本人的利用情况下应当举行进一步的平安加固。作为一个MySQL的体系办理员,我们有义务保护MySQL数据库体系的数据平安性和完全性。
MySQL数据库的平安设置必需从两个方面动手,体系外部平安和内部收集平安,别的我们还将复杂先容编程时要注重的一些成绩和一些小秘诀。
2、体系外部平安
起首复杂先容一下MySQL数据库目次布局。MySQL安装好,运转了mysql_db_install剧本今后就会创建数据目次和初始化数据库。假如我们用MySQL源码包安装,并且安装目次是/usr/local/mysql,那末数据目次一样平常会是/usr/local/mysql/var。数据库体系由一系列数据库构成,每一个数据库包括一系列数据库表。MySQL是用数据库名在数据目次创建创建一个数据库目次,各数据库表分离以数据库表名作为文件名,扩大名分离为MYD、MYI、frm的三个文件放到数据库目次中。
MySQL的受权表给数据库的会见供应了天真的权限把持,可是假如当地用户具有对库文件的读权限的话,打击者只需把数据库目次打包拷走,然后拷到本人本机的数据目次下就可以会见夺取的数据库。以是MySQL地点的主机的平安性是最主要的成绩,假如主机不平安,被打击者把持,那末MySQL的平安性也无从谈起。其次就是数据目次和数据文件的平安性,也就是权限设置成绩。
从MySQL主站一些老的binary刊行版来看,3.21.xx版本中数据目次的属性是775,如许十分伤害,任何当地用户都能够读数据目次,以是数据库文件很不平安。3.22.xx版本中数据目次的属性是770,这类属性也有些伤害,当地的同组用户既能读也能写,以是数据文件也不平安。3.23.xx版本数据目次的属性是700,如许就对照好,只要启动数据库的用户能够读写数据库文件,包管了当地数据文件的平安。
假如启动MySQL数据库的用户是mysql,那末象以下的目次和文件的是平安的,请注重数据目次及上面的属性:
shell>ls-l/usr/local/mysql
total40
drwxrwxr-x2rootroot4096Feb2720:07bin
drwxrwxr-x3rootroot4096Feb2720:07include
drwxrwxr-x2rootroot4096Feb2720:07infodrwxrwxr-x3rootroot4096Feb2720:07libdrwxrwxr-x2rootroot4096Feb2720:07libexecdrwxrwxr-x3rootroot4096Feb2720:07mandrwxrwxr-x6rootroot4096Feb2720:07mysql-testdrwxrwxr-x3rootroot4096Feb2720:07sharedrwxrwxr-x7rootroot4096Feb2720:07sql-benchdrwx------4mysqlmysql4096Feb2720:07var
shell>ls-l/usr/local/mysql/var
total8
drwx------2mysqlmysql4096Feb2720:08mysql
drwx------2mysqlmysql4096Feb2720:08test
shell>ls-l/usr/local/mysql/var/mysql
total104
-rw-------1mysqlmysql0Feb2720:08columns_PRiv.MYD
-rw-------1mysqlmysql1024Feb2720:08columns_priv.MYI
-rw-------1mysqlmysql8778Feb2720:08columns_priv.frm
-rw-------1mysqlmysql302Feb2720:08db.MYD
-rw-------1mysqlmysql3072Feb2720:08db.MYI
-rw-------1mysqlmysql8982Feb2720:08db.frm
-rw-------1mysqlmysql0Feb2720:08func.MYD
-rw-------1mysqlmysql1024Feb2720:08func.MYI
-rw-------1mysqlmysql8641Feb2720:08func.frm
-rw-------1mysqlmysql0Feb2720:08host.MYD
-rw-------1mysqlmysql1024Feb2720:08host.MYI
-rw-------1mysqlmysql8958Feb2720:08host.frm
-rw-------1mysqlmysql0Feb2720:08tables_priv.MYD
-rw-------1mysqlmysql1024Feb2720:08tables_priv.MYI
-rw-------1mysqlmysql8877Feb2720:08tables_priv.frm
-rw-------1mysqlmysql428Feb2720:08user.MYD
-rw-------1mysqlmysql2048Feb2720:08user.MYI
-rw-------1mysqlmysql9148Feb2720:08user.frm
假如这些文件的属主及属性不是如许,请用以下两个命令修改之:
shell>chown-Rmysql.mysql/usr/local/mysql/var
shell>chmod-Rgo-rwx/usr/local/mysql/var
用root用户启动远程服务一向是平安年夜忌,由于假如服务程序呈现成绩,远程打击者极有大概取得主机的完整把持权。MySQL从3.23.15版本入手下手时作了小小的修改,默许安装后服务要用mysql用户来启动,不同意root用户启动。假如非要用root用户来启动,必需加上--user=root的参数(./safe_mysqld--user=root&)。由于MySQL中有LOADDATAINFILE和SELECT...INTOOUTFILE的SQL语句,假如是root用户启动了MySQL服务器,那末,数据库用户就具有了root用户的写权限。不外MySQL仍是做了一些限定的,好比LOADDATAINFILE只能读全局可读的文件,SELECT...INTOOUTFILE不克不及掩盖已存在的文件。当地的日记文件也不克不及无视,包含shell的日记和MySQL本人的日记。有些用户在当地上岸或备份数据库的时分为了图便利,偶然会在命令行参数里间接带了数据库的暗码,如:shell>/usr/local/mysql/bin/mysqldump-uroot-ptesttest>test.sqlshell>/usr/local/mysql/bin/mysql-uroot-ptest这些命令会被shell纪录在汗青文件里,好比bash会写进用户目次的.bash_history文件,假如这些文件失慎被读,那末数据库的暗码就会泄露。用户上岸数据库后实行的SQL命令也会被MySQL纪录在用户目次的.mysql_history文件里。假如数据库用户用SQL语句修正了数据库暗码,也会因.mysql_history文件而泄露。以是我们在shell上岸及备份的时分不要在-p后间接加暗码,而是在提醒后再输出数据库暗码。
别的这两个文件我们也应当不让它纪录我们的操纵,以防万一。
shell>rm.bash_history.mysql_history
shell>ln-s/dev/null.bash_history
shell>ln-s/dev/null.mysql_history
上门这两条命令把这两个文件链接到/dev/null,那末我们的操纵就不会被纪录到这两个文件里了。
3、内部收集平安
MySQL数据库安装好今后,Unix平台的user表是如许的:
mysql>usemysql;
Databasechanged
mysql>selectHost,User,PassWord,Select_priv,Grant_privfromuser;
+-----------+------+----------+-------------+------------+
|Host|User|Password|Select_priv|Grant_priv|
+-----------+------+----------+-------------+------------+
|localhost|root||Y|Y|
|redhat|root||Y|Y|
|localhost|||N|N|
|redhat|||N|N|
+-----------+------+----------+-------------+------------+
4rowsinset(0.00sec)
Windows平台的user表是如许的:
mysql>usemysql;
Databasechanged
mysql>selectHost,User,Password,Select_priv,Grant_privfromuser;
+-----------+------+----------+-------------+------------+
|Host|User|Password|Select_priv|Grant_priv|
+-----------+------+----------+-------------+------------+
|localhost|root||Y|Y|
|%|root||Y|Y|
|localhost|||Y|Y|
|%|||N|N|
+-----------+------+----------+-------------+------------+
4rowsinset(0.00sec)我们先来看Unix平台的user表。个中redhat只是我实验机的呆板名,以是实践上Unix平台的MySQL默许只同意本机才干毗连数据库。可是缺省root用户口令是空,以是燃眉之急是给root用户加上口令。给数据库用户加口令有三种办法:1)在shell提醒符下用mysqladmin命令来改root用户口令:
shell>mysqladmin-urootpasswordtest如许,MySQL数据库root用户的口令就被改成test了。(test只是举例,我们实践利用的口令必定不克不及利用这类易猜的弱口令)
2)用setpassword修正口令:
mysql>setpasswordforroot@localhost=password(‘test‘);
这时候root用户的口令就被改成test了。
3)间接修正user表的root用户口令:
mysql>usemysql;
mysql>updateusersetpassword=password(‘test‘)whereuser=‘root‘;
mysql>flushprivileges;
如许,MySQL数据库root用户的口令也被改成test了。个中最初一句命令flushprivileges的意义是强迫革新内存受权表,不然用的仍是缓冲中的口令,这时候不法用户还能够用root用户及空口令上岸,直到重启MySQL服务器。
我们还看到user为空的匿名用户,固然它在Unix平台下没甚么权限,但为了平安起见我们应当删除它:
mysql>deletefromuserwhereuser=‘‘;
Windows版本MySQL的user表有很年夜分歧,我们看到Host字段除localhost另有是%。这里%的意义是同意恣意的主机毗连MySQL服务器,这长短常不平安的,给打击者形成无隙可乘,我们必需删除Host字段为%的纪录:
mysql>deletefromuserwherehost=‘%‘;
默许root用户的空暗码也是必需修正,三种修正办法和Unix平台一样。
我们注重到Host字段为localhost的匿名用户具有一切的权限!就是说当地用户用空的用户名和空的口令上岸MySQL数据库服务器能够失掉最高的权限!以是匿名用户必需删除!
mysql>deletefromuserwhereuser=‘‘;
对user表操纵今后不要忘了用flushprivileges来强迫革新内存受权表,如许才干失效。
默许安装的Windows版MySQL存在的不平安要素太多,我们在安装后必定要进一步设置!
MySQL的5个受权表:user,db,host,tables_priv和columns_priv供应十分天真的平安机制,从MySQL3.22.11入手下手引进了两条语句GRANT和REVOKE来创立和删除用户权限,能够便利的限定哪一个用户能够毗连服务器,从那里毗连和毗连后能够做甚么操纵。作为MySQL办理员,我们必需懂得受权表的意义和怎样用GRANT和REVOKE来创立用户、受权和撤权、删除用户。在3.22.11版本之前的MySQL受权机制不完美,和新版本也有较年夜的分歧,倡议晋级到最新版本的MySQL。(本书的操纵例子是以MySQL3.23.49
为样本)我们先来懂得受权表的布局。1)MySQL受权表的布局与内容:
mysql>descuser;
+-----------------+-----------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+-----------------+-----------------+------+-----+---------+-------+
|Host|char(60)binary||PRI|||
|User|char(16)binary||PRI|||
|Password|char(16)binary|||||
|Select_priv|enum(‘N‘,‘Y‘)|||N||
|Insert_priv|enum(‘N‘,‘Y‘)|||N||
|Update_priv|enum(‘N‘,‘Y‘)|||N||
|Delete_priv|enum(‘N‘,‘Y‘)|||N||
|Create_priv|enum(‘N‘,‘Y‘)|||N||
|Drop_priv|enum(‘N‘,‘Y‘)|||N||
|Reload_priv|enum(‘N‘,‘Y‘)|||N||
|Shutdown_priv|enum(‘N‘,‘Y‘)|||N||
|Process_priv|enum(‘N‘,‘Y‘)|||N||
|File_priv|enum(‘N‘,‘Y‘)|||N||
|Grant_priv|enum(‘N‘,‘Y‘)|||N||
|References_priv|enum(‘N‘,‘Y‘)|||N||
|Index_priv|enum(‘N‘,‘Y‘)|||N||
|Alter_priv|enum(‘N‘,‘Y‘)|||N||
+-----------------+-----------------+------+-----+---------+-------+
17rowsinset(0.01sec)
user表是5个受权表中最主要的一个,列出能够毗连服务器的用户及其加密口令,而且它指定他们有哪一种全局(超等用户)权限。在user表启用的任何权限均是全局权限,并合用于一切数据库。以是我们不克不及给任何用户会见mysql.user表的权限!
权限申明:
+-----------+-------------+-----------------------------------------------------------------------+
|权限指定符|列名|权限操纵|
+-----------+-------------+-----------------------------------------------------------------------+
|Select|Select_priv|同意对表的会见,不合错误数据表举行会见的select语句不受影响,好比select1+1|+-----------+-------------+-----------------------------------------------------------------------+
|Insert|Insert_priv|同意对表用insert语句举行写进操纵。|+-----------+-------------+-----------------------------------------------------------------------+
|Update|Update_priv|同意用update语句修正表中现有纪录。|+-----------+-------------+-----------------------------------------------------------------------+|Delete|Delete_priv|同意用delete语句删除表中现有纪录。|+-----------+-------------+-----------------------------------------------------------------------+|Create|Create_priv|同意创建新的数据库和表。|+-----------+-------------+-----------------------------------------------------------------------+
|Drop|Drop_priv|同意删除现有的数据库和表。|
+-----------+-------------+-----------------------------------------------------------------------+
|Index|Index_priv|同意创立、修正或删除索引。|
+-----------+-------------+-----------------------------------------------------------------------+
|Alter|Alter_priv|同意用alter语句修正表布局。|
+-----------+-------------+-----------------------------------------------------------------------+
|Grant|Grant_priv|同意将本人具有的权限授与别的用户,包含grant。|
+-----------+-------------+-----------------------------------------------------------------------+
|Reload|Reload|同意重载受权表,革新服务器等命令。|
+-----------+-------------+-----------------------------------------------------------------------+
|Shutdown|Shudown_priv|同意用mysqladminshutdown命令封闭MySQL服务器。该权限对照伤害,|
|||不该该任意授与。|
+-----------+-------------+-----------------------------------------------------------------------+
|Process|Process_priv|同意检察和停止MySQL服务器正在运转的线程(历程)和正在实行的查询语句|
|||,包含实行修正暗码的查询语句。该权限对照伤害,不该该任意授与。|
+-----------+-------------+-----------------------------------------------------------------------+|File|File_priv|同意从服务器上读全局可读文件和写文件。该权限对照伤害,不该该任意授与。|+-----------+-------------+-----------------------------------------------------------------------+
mysql>descdb;
+-----------------+-----------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|
+-----------------+-----------------+------+-----+---------+-------+|Host|char(60)binary||PRI||||Db|char(64)binary||PRI|||
|User|char(16)binary||PRI|||
|Select_priv|enum(‘N‘,‘Y‘)|||N|||Insert_priv|enum(‘N‘,‘Y‘)|||N|||Update_priv|enum(‘N‘,‘Y‘)|||N||
|Delete_priv|enum(‘N‘,‘Y‘)|||N||
|Create_priv|enum(‘N‘,‘Y‘)|||N||
|Drop_priv|enum(‘N‘,‘Y‘)|||N||
|Grant_priv|enum(‘N‘,‘Y‘)|||N||
|References_priv|enum(‘N‘,‘Y‘)|||N||
|Index_priv|enum(‘N‘,‘Y‘)|||N||
|Alter_priv|enum(‘N‘,‘Y‘)|||N||
+-----------------+-----------------+------+-----+---------+-------+
13rowsinset(0.01sec)
db表列出数据库,而用户有权限会见它们。在这里指定的权限合用于一个数据库中的一切表。
mysql>deschost;
+-----------------+-----------------+------+-----+---------+-------+
|Field|Type|Null|Key|Default|Extra|
+-----------------+-----------------+------+-----+---------+-------+
|Host|char(60)binary||PRI|||
|Db|char(64)binary||PRI|||
|Select_priv|enum(‘N‘,‘Y‘)|||N||
|Insert_priv|enum(‘N‘,‘Y‘)|||N||
|Update_priv|enum(‘N‘,‘Y‘)|||N||
|Delete_priv|enum(‘N‘,‘Y‘)|||N||
|Create_priv|enum(‘N‘,‘Y‘)|||N||
|Drop_priv|enum(‘N‘,‘Y‘)|||N||
|Grant_priv|enum(‘N‘,‘Y‘)|||N||
|References_priv|enum(‘N‘,‘Y‘)|||N|||Index_priv|enum(‘N‘,‘Y‘)|||N||
|Alter_priv|enum(‘N‘,‘Y‘)|||N||
+-----------------+-----------------+------+-----+---------+-------+
12rowsinset(0.01sec)
host表与db表分离利用在一个较好条理上把持特定主机对数据库的会见权限,这大概比独自利用db好些。这个表不受GRANT和REVOKE语句的影响,以是,你大概觉察你基本不是用它。
mysql>desctables_priv;
+-------------+-----------------------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|
+-------------+-----------------------------+------+-----+---------+-------+|Host|char(60)binary||PRI||||Db|char(64)binary||PRI|||
|User|char(16)binary||PRI||||Table_name|char(60)binary||PRI||||Grantor|char(77)||MUL|||
|Timestamp|timestamp(14)|YES||NULL||
|Table_priv|set(‘Select‘,‘Insert‘,|||||
||‘Update‘,‘Delete‘,‘Create‘,|||||
||‘Drop‘,‘Grant‘,‘References‘,|||||
||‘Index‘,‘Alter‘)|||||
|Column_priv|set(‘Select‘,‘Insert‘,|||||
||‘Update‘,‘References‘)|||||
+-------------+-----------------------------+------+-----+---------+-------+
8rowsinset(0.01sec)
tables_priv表指定表级权限。在这里指定的一个权限合用于一个表的一切列。
mysql>desccolumns_priv;
+-------------+------------------------+------+-----+---------+----+
|Field|Type|Null|Key|Default|Extra|
+-------------+------------------------+------+-----+---------+----+
|Host|char(60)binary||PRI|||
|Db|char(64)binary||PRI|||
|User|char(16)binary||PRI|||
|Table_name|char(64)binary||PRI|||
|Column_name|char(64)binary||PRI|||
|Timestamp|timestamp(14)|YES||NULL||
|Column_priv|set(‘Select‘,‘Insert‘,|||||
||‘Update‘,‘References‘)|||||+-------------+------------------------+------+-----+---------+-------+
7rowsinset(0.00sec)
columns_priv表指定列级权限。在这里指定的权限合用于一个表的特定列。
2)MySQL受权表运转机制
MySQL的会见把持分两个步骤:
a)服务器反省是不是同意该用户毗连。
b)假如该用户有权毗连,那末服务器还会反省它的每个哀求是不是有充足的权限。好比:用户检索数据库中的一个表必要有这个数据库的select权限,用户删除数据库中的一个表必要有这个数据库的drop权限。
受权表的user,db,host表利用这两个步骤,tables_priv和columns_priv表只利用第二步(反省哀求)。每一个受权表包括决意一个权限什么时候使用的局限列和决意授与哪一种权限的权限列。局限列指定表中的权限什么时候使用。每一个受权表条目包括User和Host列来指定权限什么时候使用于一个给定用户从给定主机的毗连。其他表包括附加的局限列,如db表包括一个Db列指出权限使用于哪一个数据库。相似地,tables_priv和columns_priv表包括局限字段,减少局限到一个数据库中的特定表或一个表的特定列。上面是user表的Host字段和User字段组合的一些例子:+-----------------------------+--------+------------------------------------------------+|Host值|User值|婚配的毗连|+-----------------------------+--------+-----------------------------------------------+
|‘x.y.z‘|‘test‘|test用户只能从x.y.z毗连数据库|
+-----------------------------+--------+-----------------------------------------------+
|‘x.y.z‘|‘‘|任何用户能够从x.y.z毗连数据库|
+-----------------------------+--------+-----------------------------------------------+
|‘%‘|‘test‘|test用户能够从恣意主机毗连数据库|
+-----------------------------+--------+----------------------------------------------+
|‘‘|‘‘|任何用户能够从恣意主机毗连数据库|
+-----------------------------+--------+-----------------------------------------------+
|‘%.y.z‘|‘test‘|test用户能够从y.z域的恣意主机毗连数据库|
+-----------------------------+--------+----------------------------------------------+
|‘x.y.%‘|‘test‘|test用户能够从x.y.net,x.y.com,x.y.edu等主机毗连数据库|+-----------------------------+--------+----------------------------------------------+
|‘192.168.1.1‘|‘test‘|test用户能够从ip地点为192.168.1.1的主机毗连数据库|
+-----------------------------+--------+---------------------------------------------+
|‘192.168.1.%‘|‘test‘|test用户能够从C类子网192.168.1中的恣意主机毗连数据库|
+-----------------------------+--------+---------------------------------------------+|‘192.168.1.0/255.255.255.0‘|‘test‘|同上|
+-----------------------------+--------+--------------------------------------------+
SQL的字符勾通配符%暗示婚配恣意字符,能够是0个字符,通配符_暗示婚配一个字符。
权限列指出在局限列中指定的用户具有何种权限。该表利用GRANT语句的权限称号。关于尽年夜多半在user、db和host表中的权限列的称号与GRANT语句中有分明的接洽。如Select_priv对应于SELECT权限。
3)受权表利用举例
grant用于给增添用户和创立权限,revoke用于删除用户权限。上面是一些用grant增添用户和创立权限的例子:
mysql>grantallprivilegeson*.*totest@localhostidentifiedby‘test‘withgrantoption;
这句增添一个当地具有一切权限的test用户(超等用户),暗码是test。ON子句中的*.*意味着"一切数据库、一切表"。withgrantoption暗示它具有grant权限。
mysql>grantselect,insert,update,delete,create,dropprivilegesontest.*totest1@‘192.168.1.0/255.255.255.0‘identifiedby‘test‘;
这句是增添了一个test1用户,口令是test,可是它只能从C类子网192.168.1毗连,对test库有select,insert,update,delete,create,drop操纵权限。
用grant语句创立权限是不必要再手工革新受权表的,由于它已主动革新了。
给用户创立权限还能够经由过程间接修正受权表:
mysql>insertintouservalues("localhost","test",password("test"),"Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y");
mysql>flushprivileges;
这两句和下面第一句grant的效果是一样的,也是增添了一个当地的test超等用户。我们看到用grant便利多了,并且还不需flushprivileges。
mysql>insertintouser(host,user,password)values("192.168.1.0/255.255.255.0","test1",PASSWORD("test"));
mysql>insertintodbvalues("192.168.1.0/255.255.255.0","test","test1","Y","Y","Y","Y","Y","Y","N","N","N","N")
mysql>flushprivileges;
这三句和下面第二句grant的效果也是一样的,也是增添了一个只能从C类子网192.168.1毗连,对test库有select,insert,update,delete,create,drop操纵权限的test1用户,口令是test。要作废一个用户的权限,利用revoke语句。revoke的语法十分相似于grant语句,除to用from代替而且没有identifiedby和withgrantoption子句,上面是用revoke删除用户权限的例子:
mysql>revokeallontest.*fromtest1@‘192.168.1.0/255.255.255.0‘;
这句revoke就取消了下面第二句grant创立的权限,可是test1用户并没有被删除,必需手工从user表删除:
mysql>deletefromuserwhereuser=‘test1‘;mysql>flushprivileges;
如许,test1用户就完全删除。
这些只是MySQL受权表的复杂利用,更多具体的材料请见MySQL供应的手册。
3、编程必要注重的一些成绩
不论是用哪一种程序言语写毗连MySQL数据库的程序,有一条原则是永久不要信任用户提交的数据!
关于数字字段,我们要利用查询语句:SELECT*FROMtableWHEREID=‘234‘,不要利用SELECT*FROMtableWHEREID=234如许的查询语句。MySQL会主动把字串转换为数字字符而且往除非数字字符。假如用户提交的数据经由了mysql_escape_string处置,如许我们就能够完整根绝了sqlinject打击,关于sqlinject打击请参考上面链接的文章:http://www.spidynamics.com/papers/S...nWhitePaper.pdf
http://www.ngssoftware.com/papers/a...l_injection.pdf
各类编程言语该注重的成绩:
1)一切Web程序:
a)实验在Web表单输出单引号和双引号来测试大概呈现的毛病,并找出缘故原由地点。
b)修正URL参数带的%22(‘"‘),%23(‘#‘),和%27(‘‘‘)。
c)关于数字字段的变量,我们的使用程序必需举行严厉的反省,不然长短常伤害的。
d)反省用户提交的数据是不是凌驾字段的长度。
e)不要给本人程序毗连数据库的用户过量的会见权限。
2)PHP:a)反省用户提交的数据在查询之前是不是经由addslashes处置,在PHP4.0.3今后供应了基于MySQLCAPI的函数mysql_escape_string()。
3)MySQLCAPI:
a)反省查询字串是不是用了mysql_escape_string()API挪用。
4)MySQL++:
a)反省查询字串是不是用了escape和quote处置。
5)PerlDBI:
a)反省查询字串是不是用了quote()办法。
6)javaJDBC:
a)反省查询字串是不是用了PreparedStatement工具。
4、一些小秘诀
1)假如失慎健忘了MySQL的root暗码,我们能够在启动MySQL服务器时加上参数--skip-grant-tables来跳过受权表的考证(./safe_mysqld--skip-grant-tables&),如许我们就能够间接上岸MySQL服务器,然后再修正root用户的口令,重启MySQL就能够用新口令上岸了。
2)启动MySQL服务器时加上--skip-show-database使一样平常数据库用户不克不及扫瞄别的数据库。3)启动MySQL服务器时加上--chroot=path参数,让mysqld保卫历程运转在chroot情况中。如许SQL语句LOADDATAINFILE和SELECT...INTOOUTFILE就限制在chroot_path下读写文件了。这里有一点要注重,MySQL启动后会创建一个mysql.sock文件,默许是在/tmp目次下。利用了chroot后,MySQL会在chroot_path/tmp往创建mysql.sock文件,假如没有chroot_path/tmp目次或启动MySQL的用户没有这个目次写权限就不克不及创建mysql.sock文件,MySQL会启动失利。好比我们加了--chroot=/usr/local/mysql/启动参数,那末最好创建一个启动MySQL的用户能写的
/usr/local/mysql/tmp目次,固然我们也能够用--socket=path来指定mysql.sock文件的路径,但这个path必定要在chroot_path内里。
4)启动MySQL服务器时加上--log-slow-queries[=file]参数,如许mysqld会把SQL命令实行工夫凌驾long_query_time的写进file文件。假如没有指定=file,mysqld默许会写到数据目次下的hostname-slow.log。假如只指定了filename,没有指定路径,那末mysqld也会把filename写到数据目次下。我们经由过程这个日记文件能够找出实行工夫超长的查询语句,然后尽量的优化它加重MySQL服务器的包袱。
5)假如我们只需本机利用MySQL服务,那末我们还能够加上--skip-networking启动参数使MySQL不监听凭何TCP/IP毗连,增添平安性。(十分保举)
6)MySQL的更多mysqld启动选项请见MySQL手册4.16.4mysqldCommand-lineOptions
5、References
MySQLManual(http://www.mysql.com/documentation/index.html)
晏子的MySQL办理员指南(http://clyan.hongnet.com/index.html)
accessGranted(http://www.devshed.com/Server_Side/MySQL/Access)
一些典型的RDBMS功能并不总是在DBaaS系统中可用。例如MySQL学习教程,WindowsAzureSQLDatabase(以前的SQLAzure)是微软的DBaaS产品,提供了一个类似于SQLServer的数据库平台。 微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数据库的一些概念可以实现了。 语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的! having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。 这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。 习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。 比如日志传送、比如集群。。。 所以你总能得到相应的升级版本,来满足你的需求。 索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。
页:
[1]