sq

阅读 / 问答 / 标签

在PHP中全面阻止SQL注入式攻击

一、 注入式攻击的类型可能存在许多不同类型的攻击动机,但是乍看上去,似乎存在更多的类型。这是非常真实的-如果恶意用户发现了一个能够执行多个查询的办法的话。如果你的脚本正在执行一个SELECT指令,那么,攻击者可以强迫显示一个表格中的每一行记录-通过把一个例如"1=1"这样的条件注入到WHERE子句中,如下所示(其中,注入部分以粗体显示):SELECT * FROM wines WHERE variety = "lagrein" OR 1=1;"正如我们在前面所讨论的,这本身可能是很有用的信息,因为它揭示了该表格的一般结构(这是一条普通的记录所不能实现的),以及潜在地显示包含机密信息的记录。一条更新指令潜在地具有更直接的威胁。通过把其它属性放到SET子句中,一名攻击者可以修改当前被更新的记录中的任何字段,例如下面的例子(其中,注入部分以粗体显示):UPDATE wines SET type="red","vintage"="9999" WHERE variety = "lagrein"通过把一个例如1=1这样的恒真条件添加到一条更新指令的WHERE子句中,这种修改范围可以扩展到每一条记录,例如下面的例子(其中,注入部分以粗体显示):UPDATE wines SET type="red","vintage"="9999 WHERE variety = "lagrein" OR 1=1;"最危险的指令可能是DELETE-这是不难想像的。其注入技术与我们已经看到的相同-通过修改WHERE子句来扩展受影响的记录的范围,例如下面的例子(其中,注入部分以粗体显示):DELETE FROM wines WHERE variety = "lagrein" OR 1=1;"二、 多个查询注入多个查询注入将会加剧一个攻击者可能引起的潜在的损坏-通过允许多条破坏性指令包括在一个查询中。在使用MySQL数据库时,攻击者通过把一个出乎意料之外的终止符插入到查询中即可很容易实现这一点-此时一个注入的引号(单引号或双引号)标记期望变量的结尾;然后使用一个分号终止该指令。现在,一个另外的攻击指令可能被添加到现在终止的原始指令的结尾。最终的破坏性查询可能看起来如下所示:SELECT * FROM wines WHERE variety = "lagrein";GRANT ALL ON *.* TO "BadGuy@%" IDENTIFIED BY "gotcha";"这个注入将创建一个新的用户BadGuy并赋予其网络特权(在所有的表格上具有所有的特权);其中,还有一个"不祥"的口令被加入到这个简单的 SELECT语句中。如果你遵循我们在以前文章中的建议-严格限制该过程用户的特权,那么,这应该无法工作,因为Web服务器守护程序不再拥有你撤回的 GRANT特权。但是从理论上讲,这样的一个攻击可能给予BadGuy自由权力来实现他对你的数据库的任何操作。至于这样的一个多查询是否会被MySQL服务器处理,结论并不唯一。这其中的一些原因可能是由于不同版本的MySQL所致,但是大多数情况却是由于多查询存在的方式所致。 MySQL的监视程序完全允许这样的一个查询。常用的MySQL GUI-phpMyAdmin,在最终查询之前会复制出以前所有的内容,并且仅仅这样做。但是,大多数的在一个注入上下文中的多查询都是由PHP的mysql扩展负责管理的。幸好,默认情况下,它是不允许在一个查询中执行多个指令的;试图执行两个指令(例如上面所示的注入)将会简单地导致失败-不设置任何错误,并且没有生成任何输出信息。在这种情况下,尽管PHP也只是"规规矩矩"地实现其缺省行为,但是确实能够保护你免于大多数简单的注入式攻击。PHP5中的新的mysqli扩展(参考),就象mysql一样,内在地也不支持多个查询,不过却提供了一个mysqli_multi_query()函数以支持你实现多查询-如果你确实想这样做的话。然而,对于SQLite-与PHP5绑定到一起的可嵌入的SQL数据库引擎(参考和http: )情况更为可怕,由于其易于使用而吸引了大量用户的关注。在有些情况下,SQLite缺省地允许这样的多指令查询,因为该数据库可以优化批查询,特别是非常有效的批INSERT语句处理。然而,如果查询的结果为你的脚本所使用的话(例如在使用一个SELECT语句检索记录的情况下),sqlite_query()函数却不会允许执行多个查询。三、 INVISION Power BOARD SQL注入脆弱性Invision Power Board是一个著名的论坛系统。2005年五月6号,在登录代码中发现了一处SQL注入脆弱性。其发现者为GulfTech Security Research的James Bercegay。这个登录查询如下所示:$DB-query("SELECT * FROM ibf_members WHERE id=$mid AND password="$pid"");其中,成员ID变量$mid和口令ID变量$pid被使用下面两行代码从my_cookie()函数中检索出:$mid = intval($std-my_getcookie("member_id"));$pid = $std-my_getcookie("pass_hash");在此,my_cookie()函数使用下列语句从cookie中检索要求的变量:return urldecode($_COOKIE[$ibforums-vars["cookie_id"].$name]);【注意】从该cookie返回的值根本没有被处理。尽管$mid在使用于查询之前被强制转换成一个整数,但是$pid却保持不变。因此,它很容易遭受我们前面所讨论的注入类型的攻击。因此,通过以如下方式修改my_cookie()函数,这种脆弱性就会暴露出来:if ( ! in_array( $name,array("topicsread", "forum_read","collapseprefs") ) ){return $this-clean_value(urldecode($_COOKIE[$ibforums-vars["cookie_id"].$name]));}else{return urldecode($_COOKIE[$ibforums-vars["cookie_id"].$name]);}经过这样的改正之后,其中的关键变量在"通过"全局clean_value()函数后被返回,而其它变量却未进行检查。现在,既然我们大致了解了什么是SQL注入,它的注入原理以及这种注入的脆弱程度,那么接下来,让我们探讨如何有效地预防它。幸好,PHP为我们提供了丰富的资源,因此我们有充分的信心预言,一个经仔细地彻底地使用我们所推荐的技术构建的应用程序将会从你的脚本中根本上消除任何可能性的SQL注入-通过在它可能造成任何损坏之前"清理"你的用户的数据来实现。

sql注入攻击方法有哪些

注入攻击方法

如何检测SQL注入技术以及跨站脚本攻击

有遵循安全代码进行开发,攻击者将通过80端口进入你的系统。广泛被使用的两个主要攻击技术是SQL注入[ref1]和CSS[ref2]攻击。SQL注入是指:通过互联网的输入区域,插入SQLmeta-characters(特殊字符

什么是sql注入漏洞

SQL注入漏洞指的是将恶意输入的SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令SQL注入漏洞顾名思义,SQL注入漏洞就是允许攻击者将恶意输入注入SQL语句。要完全理解该问题,我们首先必须了解服务器端脚本语言是如何处理SQL查询。例如,假设Web应用程序中的功能使用以下SQL语句生成一个字符串:$statement = "SELECT * FROM users WHERE username = "bob" AND password = "mysecretpw"";此SQL语句将传递给一个函数,该函数将字符串发送到已连接的数据库,在该数据库中对其进行解析,执行并返回结果。您可能已经注意到该语句包含一些新的特殊字符:* :是SQL数据库返回所选数据库行的所有列的指令= :是SQL数据库仅返回与搜索到的字符串匹配的值的指令" :用于告诉SQL数据库搜索字符串的开始或结束位置现在考虑以下示例,网站用户可以更改“$ user”和“$ password”的值,例如在登录表单中:$statement = "SELECT * FROM users WHERE username = "$user" AND password= "$password"";如果应用程序未对输入进行清理,攻击者可以在语句中轻松插入任何特殊的SQL语法:$statement = "SELECT * FROM users WHERE username = "admin"; -- " AND password= "anything"";= "anything"";admin"; - :是攻击者的输入,其中包含两个新的特殊字符:; :用于指示SQL解析器当前语句已结束(在大多数情况下不需要)- :指示SQL解析器该行的其余部分此SQL注入有效地删除了密码验证,并返回现有用户的数据集,在这种情况下为“admin”攻击者现在可以使用管理员帐户登录,而无需指定密码。

什么是sql注入,请简单的解释一下。

SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,这是SQL注入的标准释义。

信息安全试题 什么是sql注入漏洞

SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。而SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击。SQL注入漏洞有什么特点?1、广泛性:任何一个基于SQL语言的数据库都可能被攻击,很多开发人员在编写Web应用程序时未对从输入参数、Web表单、Cookie等接受到的值进行规范性验证和检测,通常会出现SQL注入漏洞。2、隐蔽性:SQL注入语句一般都嵌入在普通的HTPP请求中,很难与正常语句区分开,所以当前许多防火墙都无法识别予以警告,而且SQL注入变种极多,攻击者可以调整攻击的参数,所以使用传统的方法防御SQL注入效果非常不理想。3、危害大:攻击者可以通过SQL注入获取到服务器的库名、表名、字段名,从而获取到整个服务器中的数据,对网站用户的数据安全有极大的威胁。攻击者也可以通过获取到的数据,得到后台管理员的密码,然后对网页页面进行恶意篡改。这样不仅对数据库信息安全造成严重威胁,对整个数据库系统安全也有很大的影响。4、操作方便:互联网上有很多SQL注入工具,简单易学、攻击过程简单,不需要专业的知识也可以自如运用。

数据库操作中哪种情况会出现SQL注入

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令什么时候最易受到sql注入攻击  当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。相关的SQL注入可以通过测试工具pangolin进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。注入大致方法方法1  先猜表名   And (Select count(*) from 表名)<>0   猜列名   And (Select count(列名) from 表名)<>0   或者也可以这样   and exists (select * from 表名)   and exists (select 列名 from 表名)   返回正确的,那么写的表名或列名就是正确   这里要注意的是,exists这个不能应用于猜内容上,例如and exists (select len(user) from admin)>3 这样是不行的   现在很多人都是喜欢查询里面的内容,一旦iis没有关闭错误提示的,那么就可以利用报错方法轻松获得库里面的内容   获得数据库连接用户名:;and user>0   这个是小竹提出来的,我这里引用《SQL注入天书》里面的一段话来讲解:   "重点在and user>0,我们知道,user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个 nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示是:将nvarchar转换int异常,XXXX不能转换成int"  看到这里大家明白了吧,报错的原理就是利用SQLserver内置的系统表进行转换查询,转换过程会出错,然后就会显示出在网页上,另外还有类似的and 1=(selet top 1 user from admin),这种语句也是可以爆出来的。;and db_name()>0 则是暴数据库名。   一旦关闭了IIS报错,那么还可以用union(联合查询)来查内容,主要语句就是   Order by 10   And 1=2 union select 1,2,3,4,5,6,7,8,9,10 from admin   And 1=2 union select 1,2,3,user,5,passwd,7,8,9,10 from admin   上面的order by 10主要就是查字段数目,admin就是表名,可以自己猜,user,passwd是列名   反正就是返回正确即对,返回异常即错   另外还有十分常用的ascll码拆半法   先要知道指定列名,例如user里的内容的长度   and (select len(user) from admin)=2 就是查询长度为不为2位,返回错误的增加或减少数字,一般这个数字不会太大,太大的就要放弃了,猜也多余   后面的逻辑符号可以根据不同要求更改的,   >;大于 <;小于 =就是等于咯,更新语句的话,=也可以表示传递符号 <>;就是不等   知道了长度后就可以开始猜解了   And (Select top 1 asc(mid(user,n,1)) from admin)>100   n就是猜解的表名的第几位,最后的长度数字就是刚才猜解出来的列名长度了,And (Select top 1 asc(mid(user,1,1)) from admin)>100 就是猜解user里内容的第一位的ASCLL字符是不是大于100   正确的话,那么表示USER第一个字符的ASCLL码大于100,那么就猜>120,返回错误就是介于100-120之间,然后再一步一步的缩少,最终得到正确字符XXX,然后用ASCLL转换器吧这个转换成普通字符就可以了   然后就是第二位 And (Select top 1 asc(mid(user,2,1)) from admin)>100 一直猜下去   加在url后面,列名表名还是先猜解,返回正确的代表帐号的ascll码大于100,那么就再向前猜,指导报错,把猜出来的ascll码拿去ascll转换器转换就可以了,中文是负数,加上asb取绝对值   And (Select top 1 asb(asc(mid(user,n,1))) from admin)>15320   得到之后就记得在数字前加-号,不然ASCLL转换器转换不来的,中文在ASCLL码里是-23423这样的,所以猜起来挺麻烦   这个猜解速度比较慢,但是效果最好,最具有广泛性方法2  后台身份验证绕过漏洞   验证绕过漏洞就是"or"="or"后台绕过漏洞,利用的就是AND和OR的运算规则,从而造成后台脚本逻辑性错误   例如管理员的账号密码都是admin,那么再比如后台的数据库查询语句是   user=request("user")   passwd=request("passwd")   sql="select admin from adminbate where user="&"""&user&"""&" and passwd="&"""&passwd&"""   那么我使用"or "a"="a来做用户名密码的话,那么查询就变成了   select admin from adminbate where user=""or "a"="a" and passwd=""or "a"="a"   这样的话,根据运算规则,这里一共有4个查询语句,那么查询结果就是 假or真and假or真,先算and 再算or,最终结果为真,这样就可以进到后台了   这种漏洞存在必须要有2个条件,第一个:在后台验证代码上,账号密码的查询是要同一条查询语句,也就是类似   sql="select * from admin where username=""&username&"&"passwd=""&passwd&"   如果一旦账号密码是分开查询的,先查帐号,再查密码,这样的话就没有办法了。   第二就是要看密码加不加密,一旦被MD5加密或者其他加密方式加密的,那就要看第一种条件有没有可以,没有达到第一种条件的话,那就没有戏了摘自:http://baike.baidu.com/view/3896.htm

什么是SQL注入,如何防止SQL注入?

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.x0dx0a防护x0dx0a归纳一下,主要有以下几点:x0dx0a1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和x0dx0a双"-"进行转换等。x0dx0a2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。x0dx0a3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。x0dx0a4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。x0dx0a5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装x0dx0a6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

什么叫做SQL注入,如何防止?请举例说明。

SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,这是SQL注入的标准释义。

如何对一个网站进行SQL注入攻击

1.POST注入,通用防注入一般限制get,但是有时候不限制post或者限制的很少,这时候你就可以试下post注入,比如登录框、搜索框、投票框这类的。另外,在asp中post已被发扬光大,程序员喜欢用receive来接受数据,这就造成了很多时候get传递的参数通过post/cookie也能传递,这时如果恰好防注入程序只限制了get,因此post注入不解释2.cookie注入,原理同post注入,绕过相当多通用防注入3.二次注入,第一次注入的数据可能不会有效,但是如果将来能在某个页面里面被程序处理呢?注入来了……4.csrf,适合后台地址已知并且存在已知0day,可以试试用csrf劫持管理员来进行操作(这招其实不属于sql注入了)5.打碎关键字,比如过滤select,我可以用sel/**/ect来绕过,这招多见于mysql6.有时候也可以sELeCT这样大小写混淆绕过7.用chr对sql语句编码进行绕过8.如果等于号不好使,可以试试大于号或者小于号,如果and不好使可以试试or,这样等价替换9.多来几个关键字确定是什么防注入程序,直接猜测源码或者根据报错关键字(如"非法操作,ip地址已被记录")把源码搞下来研究10.记录注入者ip和语句并写入文件或数据库,然而数据库恰好是asp的,插马秒杀

sql注入漏洞是缓冲区溢出漏洞吗

打开腾讯智慧安全页面然后在里面找到御点终端安全系统接着选择上方产品选项,在里面选择腾讯御点,修复漏洞

PHP代码网站如何防范SQL注入漏洞攻击建议分享

做为网络开发者的你对这种黑客行为恨之入骨,当然也有必要了解一下SQL注入这种功能方式的原理并学会如何通过代码来保护自己的网站数据库。今天就通过PHP和MySQL数据库为例,分享一下我所了解的SQL注入攻击和一些简单的防范措施和一些如何避免SQL注入攻击的建议。简单来说,SQL注入是使用代码漏洞来获取网站或应用程序后台的SQL数据库中的数据,进而可以取得数据库的访问权限。比如,黑客可以利用网站代码的漏洞,使用SQL注入的方式取得一个公司网站后台数据库里所有的数据信息。拿到数据库管理员登录用户名和密码后黑客可以自由修改数据库中的内容甚至删除该数据库。SQL注入也可以用来检验一个网站或应用的安全性。SQL注入的方式有很多种,但本文将只讨论最基本的原理,我们将以PHP和MySQL为例。本文的例子很简单,如果你使用其它语言理解起来也不会有难度,重点关注SQL命令即可。一个简单的SQL注入攻击案例假如我们有一个公司网站,在网站的后台数据库中保存了所有的客户数据等重要信息。假如网站登录页面的代码中有这样一条命令来读取用户信息。$q = "SELECT `id` FROM `users` WHERE `username`= " " .$_GET["username"]. " " AND `password`= " " .$_GET["password"]. " " ";?>现在有一个黑客想攻击你的数据库,他会尝试在此登录页面的用户名的输入框中输入以下代码:" ; SHOW TABLES;点击登陆键,这个页面就会显示出数据库中的所有表。如果他现在使用下面这行命令:"; DROP TABLE [table name];这样他就把一张表删除了!防范SQL注入 - 使用mysql_real_escape_string()函数在数据库操作的代码中用这个函数mysql_real_escape_string()可以将代码中特殊字符过滤掉,如引号等。如下例:$q = "SELECT `id` FROM `users` WHERE `username`= " " .mysql_real_escape_string( $_GET["username"] ). " " AND `password`= " " .mysql_real_escape_string( $_GET["password"] ). " " ";?>防范SQL注入 - 使用mysql_query()函数mysql_query()的特别是它将只执行SQL代码的第一条,而后面的并不会执行。回想在最前面的例子中,黑客通过代码来例后台执行了多条SQL命令,显示出了所有表的名称。所以mysql_query()函数可以取到进一步保护的作用。我们进一步演化刚才的代码就得到了下面的代码://connection$database = mysql_connect("localhost", "username","password");//db selection$q = mysql_query("SELECT `id` FROM `users` WHERE `username`= " " .mysql_real_escape_string( $_GET["username"] ). " " AND `password`= " " .mysql_real_escape_string( $_GET["password"] ). " " ", $database);?>除此之外,我们还可以在PHP代码中判断输入值的长度,或者专门用一个函数来检查输入的值。所以在接受用户输入值的地方一定要做好输入内容的过滤和检查。当然学习和了解最新的SQL注入方式也非常重要,这样才能做到有目的的防范。如果使用的是平台式的网站系统如Wordpress,要注意及时打上官方的补丁或升级到新的版本。

如何利用sql注入攻击删除文件

sql注入已经是很久之前的事了,现在都是hql语言,所有的输入都是转为字符串,不会直接拼装sql。

什么是sql 注入,如何实现注入?

比如a.asp:<%haha=request.querystring("haha")Set rs = Server.CreateObject("ADODB.Recordset")sql=select * from data where words=""&haha&"" order by hits desc"rs.open sql,conn,1,1%><html><font color=red><%=rs("words")%><font color=blue><%=rs("hits")%>go.asp:<form action=a.asp method=get><input type=text name="haha"><input type=submit value=提交></form>如果我想SQL注入,先提交提个数据比如“我”,这样,提交后,转到页面a.asp地址是这样的:a.asp?haha=wo如果加上a.asp?haha=wo 1=2这样的地址就会出错,如果你没有防范,那么你的数据库、连接方式、表的字段名就会暴露。给黑客留下可趁之机,说白了,SQL注入就是利用你的程序不严谨,从而注入非法的SQL语句,获得非法信息的方式。详细见上面;)

什么是sql注入攻击,请结合实例简述其原理

作为一名学生,大家都经历过考试,既然有考试,那将需要时间地点科目:____月____日____时____分,第____教学楼____层____教室,考________,时长____分。一个考试应该是这样的:6月23日9时30分,第13教学楼6层601教室,考高等数学,时长120分。你是一个学生,你按照学校安排执行:到了6月23号9.30,然后拿着证件和笔去13教学楼6层601考高等数学。但是如果空格里填写了不正常的值,甚至包含了指令:6月23日9时30分,第13教学楼6层601教室,考英语,时长90分钟。6月24日9时30分,第13教学楼6层601教室高等数学,时长120分。作为一名人类,可以轻易发现科目处添了一串指令,但是如果是机器呢?

什么是sql注入,怎么防止注入

sql注入攻击,就是利用程序员开发时候操作数据库的低级错误进行攻击。主要手段就是利用拼接字符串来实现一些操作。工具呢,也有一些,你搜索一下就能找到。不过这种攻击明显已经过时了,尤其是有了linq以后,正式退出了历史舞台。

sql 注入攻击原理?

有的页面是用url传值的,http://zhidao.baidu.com/question/545604186.html?push=core&group=1我们可以拿到其中的一段url,然后根据url去才后台数据库的代码。比如一段java代码String sql="select * from user where loginid=""+loginid+""";loginid这个是你从页面输入的是用户名。如果loginid你输入‘ or 1=1 or loginid="这样最终形成的sql就是select * from user where loginid="‘ or 1=1 or loginid="‘;这个sql是可以运行的。类似这样。看一下这个http://baike.baidu.com/view/983303.htm

什么是SQL注入?

php

浅析sql注入漏洞与防范措施谁写的

SQL注入漏洞是一种常见的Web漏洞,攻击者可以利用这种漏洞来获取、修改或删除数据库中的数据。攻击者通常会在用户输入的数据中注入恶意的SQL代码,通过这些代码来执行非法的操作。下面是一些可以预防SQL注入漏洞的措施:1. 使用参数化查询:这是最基本的预防措施,可以防止恶意代码的注入。参数化查询是将用户输入的数据作为参数,而不是直接拼接到SQL语句中。2. 检验用户输入:在用户输入数据之前,应该校验数据的格式、长度、类型等信息。 输入数据应该进行过滤和转义,例如将单引号转义为两个单引号。3. 限制数据库用户权限:不同的用户角色应该有不同的数据库权限,尽可能地限制用户可以访问和操作的数据。比如,只给应用程序查看和修改表数据的权限,不要给它删除表的权限。4. 更新数据库软件和补丁:保持数据库软件和补丁的最新状态,补救已知的安全漏洞。总之,要预防SQL注入漏洞,需要从编写代码和设计数据库架构两个方面入手。开发人员应该了解SQL注入的工作原理和方法,以及如何预防和处理可能出现的漏洞。

什么是SQL注入式攻击 如何防范

一、 SQL注入攻击的简单示例。  statement := "SELECT * FROM Users WHERE Value= " + a_variable + "  上面这条语句是很普通的一条SQL语句,他主要实现的功能就是让用户输入一个员工编号然后查询处这个员工的信息。但是若这条语句被不法攻击者改装过后,就可能成为破坏数据的黑手。如攻击者在输入变量的时候,输入以下内容SA001";drop table c_order--。那么以上这条SQL语句在执行的时候就变为了SELECT * FROM Users WHERE Value= ‘SA001";drop table c_order--。  这条语句是什么意思呢?‘SA001"后面的分号表示一个查询的结束和另一条语句的开始。c_order后面的双连字符 指示当前行余下的部分只是一个注释,应该忽略。如果修改后的代码语法正确,则服务器将执行该代码。系统在处理这条语句时,将首先执行查询语句,查到用户编号为SA001 的用户信息。然后,数据将删除表C_ORDER(如果没有其他主键等相关约束,则删除操作就会成功)。只要注入的SQL代码语法正确,便无法采用编程方式来检测篡改。因此,必须验证所有用户输入,并仔细检查在您所用的服务器中执行构造 SQL命令的代码。二、 SQL注入攻击原理。  可见SQL注入攻击的危害性很大。在讲解其防止办法之前,数据库管理员有必要先了解一下其攻击的原理。这有利于管理员采取有针对性的防治措施。  SQL注入是目前比较常见的针对数据库的一种攻击方式。在这种攻击方式中,攻击者会将一些恶意代码插入到字符串中。然后会通过各种手段将该字符串传递到SQLServer数据库的实例中进行分析和执行。只要这个恶意代码符合SQL语句的规则,则在代码编译与执行的时候,就不会被系统所发现。  SQL注入式攻击的主要形式有两种。一是直接将代码插入到与SQL命令串联在一起并使得其以执行的用户输入变量。上面笔者举的例子就是采用了这种方法。由于其直接与SQL语句捆绑,故也被称为直接注入式攻击法。二是一种间接的攻击方法,它将恶意代码注入要在表中存储或者作为原书据存储的字符串。在存储的字符串中会连接到一个动态的SQL命令中,以执行一些恶意的SQL代码。  注入过程的工作方式是提前终止文本字符串,然后追加一个新的命令。如以直接注入式攻击为例。就是在用户输入变量的时候,先用一个分号结束当前的语句。然后再插入一个恶意SQL语句即可。由于插入的命令可能在执行前追加其他字符串,因此攻击者常常用注释标记“—”来终止注入的字符串。执行时,系统会认为此后语句位注释,故后续的文本将被忽略,不背编译与执行。  三、 SQL注入式攻击的防治。  既然SQL注入式攻击的危害这么大,那么该如何来防治呢?下面这些建议或许对数据库管理员防治SQL注入式攻击有一定的帮助。  1、 普通用户与系统管理员用户的权限要有严格的区分。  如果一个普通用户在使用查询语句中嵌入另一个Drop Table语句,那么是否允许执行呢?由于Drop语句关系到数据库的基本对象,故要操作这个语句用户必须有相关的权限。在权限设计中,对于终端用户,即应用软件的使用者,没有必要给他们数据库对象的建立、删除等权限。那么即使在他们使用SQL语句中带有嵌入式的恶意代码,由于其用户权限的限制,这些代码也将无法被执行。故应用程序在设计的时候,最好把系统管理员的用户与普通用户区分开来。如此可以最大限度的减少注入式攻击对数据库带来的危害。   2、 强迫使用参数化语句。  如果在编写SQL语句的时候,用户输入的变量不是直接嵌入到SQL语句。而是通过参数来传递这个变量的话,那么就可以有效的防治SQL注入式攻击。也就是说,用户的输入绝对不能够直接被嵌入到SQL语句中。与此相反,用户的输入的内容必须进行过滤,或者使用参数化的语句来传递用户输入的变量。参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。采用这种措施,可以杜绝大部分的SQL注入式攻击。不过可惜的是,现在支持参数化语句的数据库引擎并不多。不过数据库工程师在开发产品的时候要尽量采用参数化语句。3、 加强对用户输入的验证。  总体来说,防治SQL注入式攻击可以采用两种方法,一是加强对用户输入内容的检查与验证;二是强迫使用参数化语句来传递用户输入的内容。在SQLServer数据库中,有比较多的用户输入内容验证工具,可以帮助管理员来对付SQL注入式攻击。测试字符串变量的内容,只接受所需的值。拒绝包含二进制数据、转义序列和注释字符的输入内容。这有助于防止脚本注入,防止某些缓冲区溢出攻击。测试用户输入内容的大小和数据类型,强制执行适当的限制与转换。这即有助于防止有意造成的缓冲区溢出,对于防治注入式攻击有比较明显的效果。  如可以使用存储过程来验证用户的输入。利用存储过程可以实现对用户输入变量的过滤,如拒绝一些特殊的符号。如以上那个恶意代码中,只要存储过程把那个分号过滤掉,那么这个恶意代码也就没有用武之地了。在执行SQL语句之前,可以通过数据库的存储过程,来拒绝接纳一些特殊的符号。在不影响数据库应用的前提下,应该让数据库拒绝包含以下字符的输入。如分号分隔符,它是SQL注入式攻击的主要帮凶。如注释分隔符。注释只有在数据设计的时候用的到。一般用户的查询语句中没有必要注释的内容,故可以直接把他拒绝掉,通常情况下这么做不会发生意外损失。把以上这些特殊符号拒绝掉,那么即使在SQL语句中嵌入了恶意代码,他们也将毫无作为。  故始终通过测试类型、长度、格式和范围来验证用户输入,过滤用户输入的内容。这是防止SQL注入式攻击的常见并且行之有效的措施。   4、 多多使用SQL Server数据库自带的安全参数。  为了减少注入式攻击对于SQL Server数据库的不良影响,在SQLServer数据库专门设计了相对安全的SQL参数。在数据库设计过程中,工程师要尽量采用这些参数来杜绝恶意的SQL注入式攻击。  如在SQL Server数据库中提供了Parameters集合。这个集合提供了类型检查和长度验证的功能。如果管理员采用了Parameters这个集合的话,则用户输入的内容将被视为字符值而不是可执行代码。即使用户输入的内容中含有可执行代码,则数据库也会过滤掉。因为此时数据库只把它当作普通的字符来处理。使用Parameters集合的另外一个优点是可以强制执行类型和长度检查,范围以外的值将触发异常。如果用户输入的值不符合指定的类型与长度约束,就会发生异常,并报告给管理员。如上面这个案例中,如果员工编号定义的数据类型为字符串型,长度为10个字符。而用户输入的内容虽然也是字符类型的数据,但是其长度达到了20个字符。则此时就会引发异常,因为用户输入的内容长度超过了数据库字段长度的限制。   5、 多层环境如何防治SQL注入式攻击?  在多层应用环境中,用户输入的所有数据都应该在验证之后才能被允许进入到可信区域。未通过验证过程的数据应被数据库拒绝,并向上一层返回一个错误信息。实现多层验证。对无目的的恶意用户采取的预防措施,对坚定的攻击者可能无效。更好的做法是在用户界面和所有跨信任边界的后续点上验证输入。如在客户端应用程序中验证数据可以防止简单的脚本注入。但是,如果下一层认为其输入已通过验证,则任何可以绕过客户端的恶意用户就可以不受限制地访问系统。故对于多层应用环境,在防止注入式攻击的时候,需要各层一起努力,在客户端与数据库端都要采用相应的措施来防治SQL语句的注入式攻击。   6、 必要的情况下使用专业的漏洞扫描工具来寻找可能被攻击的点。  使用专业的漏洞扫描工具,可以帮助管理员来寻找可能被SQL注入式攻击的点。不过漏洞扫描工具只能发现攻击点,而不能够主动起到防御SQL注入攻击的作用。当然这个工具也经常被攻击者拿来使用。如攻击者可以利用这个工具自动搜索攻击目标并实施攻击。为此在必要的情况下,企业应当投资于一些专业的漏洞扫描工具。一个完善的漏洞扫描程序不同于网络扫描程序,它专门查找数据库中的SQL注入式漏洞。最新的漏洞扫描程序可以查找最新发现的漏洞。所以凭借专业的工具,可以帮助管理员发现SQL注入式漏洞,并提醒管理员采取积极的措施来预防SQL注入式攻击。如果攻击者能够发现的SQL注入式漏洞数据库管理员都发现了并采取了积极的措施堵住漏洞,那么攻击者也就无从下手了。

什么是sql注入如何防止sql注入

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入

SQL注入是怎么回事

SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,这是SQL注入的标准释义。

什么是sql注入攻击

SQL注入攻击是黑客对数据库进行攻击的常用手段之一。下面本篇文章就来给大家介绍一下SQL注入攻击,希望对你们有所帮助。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。SQL注入攻击属于数据库安全攻击手段之一,黑客可以通过将任意恶意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加,修改和删除数据库中的记录。SQL注入漏洞可能会影响使用SQL数据库(如MySQL,Oracle,SQL Server或其他)的任何网站或Web应用程序。犯罪分子可能会利用它来未经授权访问用户的敏感数据:客户信息,个人数据,商业机密,知识产权等。SQL注入攻击是最古老,最流行,最危险的Web应用程序漏洞之一。SQL注入攻击可以通过数据库安全防护技术实现有效防护,数据库安全防护技术包括:数据库漏扫、数据库加密、数据库防火墙、数据脱敏、数据库安全审计系统。

什么是sql注入攻击

请参考SQL 注入天书~所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击. 当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造(或者影响)动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。

什么是SQL注入?

注入攻击最常见的形式,主要是指Web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在Web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询或其他操作,导致数据库信息泄露或非授权操作数据表。

试解释 SQL 注入攻击的原理,以及对数据库可能产生的不利影响。

楼上的解释得很详细,学习了。

sql注入是什么

SQL注入攻击是通过操作输入来修改SQL语句,用以达到执行代码对WEB服务器进行攻击的方法。简单的说就是在post/getweb表单、输入域名或页面请求的查询字符串中插入SQL命令,最终使web服务器执行恶意命令的过程。可以通过一个例子简单说明SQL注入攻击。假设某网站页面显示时URL为http://www.example.com?test=123,此时URL实际向服务器传递了值为123的变量test,这表明当前页面是对数据库进行动态查询的结果。由此,我们可以在URL中插入恶意的SQL语句并进行执行。另外,在网站开发过程中,开发人员使用动态字符串构造SQL语句,用来创建所需的应用,这种情况下SQL语句在程序的执行过程中被动态的构造使用,可以根据不同的条件产生不同的SQL语句,比如需要根据不同的要求来查询数据库中的字段。这样的开发过程其实为SQL注入攻击留下了很多的可乘之机。

SQL注入原理以及如何避免注入

SQL注入:到底什么时候会用到SQL呢?回答是访问数据库的时候,也就是说SQL注入-->直接威胁到了数据源,呵呵,数据库都收到了威胁,网站还能正常现实么?所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。[1]比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:①不当的类型处理;②不安全的数据库配置;③不合理的查询集处理;④不当的错误处理;⑤转义字符处理不合适;⑥多个提交处理不当。注入方法:1.猜表名,列名等先猜表名And (Select count(*) from 表名)<>0猜列名And (Select count(列名) from 表名)<>0或者也可以这样and exists (select * from 表名)and exists (select 列名 from 表名)返回正确的,那么写的表名或列名就是正确2.后台身份验证绕过漏洞验证绕过漏洞就是‘or‘=‘or‘后台绕过漏洞,利用的就是AND和OR的运算规则,从而造成后台脚本逻辑性错误例如管理员的账号密码都是admin,那么再比如后台的数据库查询语句是user=request("user")passwd=request("passwd")sql=‘select admin from adminbate where user=‘&‘‘‘&user&‘‘‘&‘ and passwd=‘&‘‘‘&passwd&‘‘‘那么我使用‘or ‘a‘=‘a来做用户名密码的话,那么查询就变成了select admin from adminbate where user=‘‘or ‘a‘=‘a‘ and passwd=‘‘or ‘a‘=‘a‘这样的话,根据运算规则,这里一共有4个查询语句,那么查询结果就是 假or真and假or真,先算and 再算or,最终结果为真,这样就可以进到后台了如何预防 呢?归纳一下,主要有以下几点:1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。等待试验........ 版权声明:本文为博主原创文章,未经博主允许不得转载。 SQL注入原理以及如何避免注入标签:sql注入存储结构过滤select

什么是sql注入,怎么防止sql注入

原理SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:①不当的类型处理;②不安全的数据库配置;③不合理的查询集处理;④不当的错误处理;⑤转义字符处理不合适;⑥多个提交处理不当。攻击当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。相关的SQL注入可以通过测试工具pangolin进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。防护归纳一下,主要有以下几点:1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

什么是触发器?SQL中的哪几种操作会触发触发器?

前触发 你对表数据进行操作之前 做的事情后触发 你对表数据进行操作之后 做的事情对表数据的操作无非增 删 改(查询没有触发的)

SQL触发器有什么用处啊?

  触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。触发器可以查询其它表,并可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到严重错误(例如,磁盘空间不足),则整个事务即自动回滚。   触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。  触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。   与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。  触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。  一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。   比较触发器与约束  约束和触发器在特殊情况下各有优势。触发器的主要好处在于它们可以包含使用 Transact-SQL 代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但它在所给出的功能上并不总是最好的方法。  实体完整性总应在最低级别上通过索引进行强制,这些索引或是 PRIMARY KEY 和 UNIQUE 约束的一部分,或是在约束之外独立创建的。假设功能可以满足应用程序的功能需求,域完整性应通过 CHECK 约束进行强制,而引用完整性 (RI) 则应通过 FOREIGN KEY 约束进行强制。  在约束所支持的功能无法满足应用程序的功能要求时,触发器就极为有用。例如:   除非 REFERENCES 子句定义了级联引用操作,否则 FOREIGN KEY 约束只能以与另一列中的值完全匹配的值来验证列值。  CHECK 约束只能根据逻辑表达式或同一表中的另一列来验证列值。如果应用程序要求根据另一个表中的列验证列值,则必须使用触发器。  约束只能通过标准的系统错误信息传递错误信息。如果应用程序要求使用(或能从中获益)自定义信息和较为复杂的错误处理,则必须使用触发器。   触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。   触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。当更改外键且新值与主键不匹配时,此类触发器就可能发生作用。例如,可以在 titleauthor.title_id 上创建一个插入触发器,使它在新值与 titles.title_id 中的某个值不匹配时回滚一个插入。不过,通常使用 FOREIGN KEY 来达到这个目的。  如果触发器表上存在约束,则在 INSTEAD OF 触发器执行后但在 AFTER 触发器执行前检查这些约束。如果约束破坏,则回滚 INSTEAD OF 触发器操作并且不执行 AFTER 触发器。

SQL触发器怎么用

在SQL中,触发器是一种特殊类型的存储过程,它不同于SQL的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如UPDATE、 INSERT、 DELETE 这些操作时,SQL Server 就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:(1)强化约束(Enforce restriction)触发器能够实现比CHECK 语句更为复杂的约束。(2)跟踪变化(Auditing changes)触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。(3)级联运行(Cascaded operation)。触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。(4)存储过程的调用(Stored procedure invocation)。为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作。由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(INSERT、 UPDATE、 DELETE)的多个触发器能够对同一种数据操作采取多种不同的处理。总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。触发器的种类SQL Server 2000 支持两种类型的触发器:AFTER 触发器和INSTEAD OF 触发器。其中AFTER 触发器即为SQL Server 2000 版本以前所介绍的触发器。该类型触发器要求只有执行某一操作(INSERT UPDATE DELETE) 之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER 触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder 来完成此任务。INSTEAD OF 触发器表示并不执行其所定义的操作(INSERT、 UPDATE、 DELETE),而仅是执行触发器本身。既可在表上定义INSTEAD OF 触发器,也可以在视图上定义INSTEAD OF 触发器,但对同一操作只能定义一个INSTEAD OF触发器。

SQL中触发器有什么作用

没有相关的需求就不要用,有相关的需求才用,比如给某个表建一个插入的触发器,这表中有个记录条数的字段,则每当给库中插入一条数据时,你可以给那个记录条数的字段加1等操作

mysql触发器怎么写

触发器是与 MySQL 数据表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。语法格式如下:CREATE <触发器名> < BEFORE | AFTER ><INSERT | UPDATE | DELETE >ON <表名> FOR EACH Row<触发器主体>语法说明如下。1) 触发器名触发器的名称,触发器在当前数据库中必须具有唯一的名称。如果要在某个特定数据库中创建,名称前面应该加上数据库的名称。2) INSERT | UPDATE | DELETE触发事件,用于指定激活触发器的语句的种类。注意:三种触发器的执行时间如下。INSERT:将新行插入表时激活触发器。例如,INSERT 的 BEFORE 触发器不仅能被 MySQL 的 INSERT 语句激活,也能被 LOAD DATA 语句激活。DELETE: 从表中删除某一行数据时激活触发器,例如 DELETE 和 REPLACE 语句。UPDATE:更改表中某一行数据时激活触发器,例如 UPDATE 语句。3) BEFORE | AFTERBEFORE 和 AFTER,触发器被触发的时刻,表示触发器是在激活它的语句之前或之后触发。若希望验证新数据是否满足条件,则使用 BEFORE 选项;若希望在激活触发器的语句执行之后完成几个或更多的改变,则通常使用 AFTER 选项。4) 表名与触发器相关联的表名,此表必须是永久性表,不能将触发器与临时表或视图关联起来。在该表上触发事件发生时才会激活触发器。同一个表不能拥有两个具有相同触发时刻和事件的触发器。例如,对于一张数据表,不能同时有两个 BEFORE UPDATE 触发器,但可以有一个 BEFORE UPDATE 触发器和一个 BEFORE INSERT 触发器,或一个 BEFORE UPDATE 触发器和一个 AFTER UPDATE 触发器。5) 触发器主体触发器动作主体,包含触发器激活时将要执行的 MySQL 语句。如果要执行多个语句,可使用 BEGIN?END 复合语句结构。6) FOR EACH ROW一般是指行级触发,对于受触发事件影响的每一行都要激活触发器的动作。例如,使用 INSERT 语句向某个表中插入多行数据时,触发器会对每一行数据的插入都执行相应的触发器动作。注意:每个表都支持 INSERT、UPDATE 和 DELETE 的 BEFORE 与 AFTER,因此每个表最多支持 6 个触发器。每个表的每个事件每次只允许有一个触发器。单一触发器不能与多个事件或多个表关联。另外,在 MySQL 中,若需要查看数据库中已有的触发器,则可以使用 SHOW TRIGGERS 语句。例子:BEGIN IF new.state in ("2","3") then INSERT INTO `userservice`.`ehome_us_green_examine` (modifydate,modifyuser,brancCode,stateDescription,state,userID,fromSystemkey,applydate,makeHospitalName,illnessName,userName,rightsholderName,tranno) VALUES ( sysdate(), "manage", old.brancCode, old.stateDescription, new.state, "", old.fromSystemkey, old.applydate,old.makeHospitalName,old.illnessName,old.userName,old.rightsholderName, old.tranno);END IF; END这个触发器比较简单,1、BEGIN到END,之间是对数据库的操作2、IF到END IF之间是判断,你想的对,就是如果。。的意思3、new.state in ("2","3") 这句的意思是:该表的字段state为(2或者3)的时候 4、执行下面的插入语句,new为新值,old是原来的值(如old.userName就是原来的这个字段的值)5、整个触发器翻译成白话就是,如果该表的state变成2或者3的时候,执行下面的插入语句备注:那么触发器是发生在状态变化之前还是之后呢?选Before或者After,顾名思义!

SQL中触发器有什么作用

触发器可以查询其它表,而且可以包含复杂的 SQL 语句。它们主要用于强制复杂的业务规则或要求。例如,可以控制是否允许基于顾客的当前帐户状态插入定单。 触发器还有助于强制引用完整性,以便在添加、更新或删除表中的行时保留表之间已定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。 触发器的优点如下: 触发器是自动的:它们在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。触发器可以通过数据库中的相关表进行层叠更改。例如,可以在 titles 表的 title_id 列上写入一个删除触发器,以使其它表中的各匹配行采取删除操作。该触发器用 title_id 列作为唯一键,在 titleauthor、sales 及 roysched 表中对各匹配行进行定位。触发器可以强制限制,这些限制比用 CHECK 约束所定义的更复杂。与 CHECK 约束不同的是,触发器可以引用其它表中的列。例如,触发器可以回滚试图对价格低于 10 美元的书(存储在 titles 表中)应用折扣(存储在 discounts 表中)的更新。

SQL server中有哪几种触发器?

分类: 电脑/网络 >> 程序设计 >> 其他编程语言 解析: 触发器的概念及作用 触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如UPDATE、 INSERT、 DELETE 这些操作时,SQL Server 就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。 触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能: (1) 强化约束(Enforce restriction)触发器能够实现比CHECK 语句更为复杂的约束。 (2) 跟踪变化Auditing changes 触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。 (3) 级联运行(Cascaded operation)。 触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。 (4) 存储过程的调用(Stored procedure invocation)。 为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作。 由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(INSERT、 UPDATE、 DELETE)的多个触发器能够对同一种数据操作采取多种不同的处理。 总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。 触发器的种类 SQL Server 2000 支持两种类型的触发器:AFTER 触发器和INSTEAD OF 触发器。其中AFTER 触发器即为SQL Server 2000 版本以前所介绍的触发器。该类型触发器要求只有执行某一操作(INSERT UPDATE DELETE) 之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER 触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder 来完成此任务。 INSTEAD OF 触发器表示并不执行其所定义的操作(INSERT、 UPDATE、 DELETE),而仅是执行触发器本身。既可在表上定义INSTEAD OF 触发器,也可以在视图上定义INSTEAD OF 触发器,但对同一操作只能定义一个INSTEAD OF 触发器。

SQL中的“触发器”是什么?

触发器是对表进行插入、更新、删除的时候会自动执行的特殊存储过程。x0dx0ax0dx0a触发器一般用在check约束更加复杂的约束上面。例如在执行update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。x0dx0ax0dx0aSQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。 x0dx0ax0dx0a DML触发器分为: x0dx0a 1、 after触发器(之后触发) x0dx0a a、 insert触发器 x0dx0a b、 update触发器 x0dx0a c、 delete触发器 x0dx0a 2、 instead of 触发器 (之前触发) x0dx0ax0dx0a其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。 x0dx0ax0dx0a触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。x0dx0ax0dx0aUpdate数据的时候就是先删除表记录,然后增加一条记录。这样在inserted和deleted表就都有update后的数据记录了。注意的是:触发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。如果不满足可以利用事务回滚,撤销操作。

AO史密斯JSQ33一MJSX与JSQ33一JSX有什么区别?

的事,我现在去的人都知道我在学校

mysql如何快速查询

更多相关免费学习推荐:mysql教程(视频)mysql快速查询的方法:1.查询正在运行中的事务select p.id,p.user,p.host,p.db,p.command,p.time,i.trx_state,i.trx_started,p.info from information_schema.processlist p,information_schema.innodb_trx i where p.id=i.trx_mysql_thread_id;2.查看当前连接,并且能够知晓连接数select SUBSTRING_INDEX(host,‘:‘,1) as ip , count(*) from information_schema.processlist group by ip;3.查看一个表的大小select concat(round(sum(DATA_LENGTH/1024/1024),2),‘M‘) from information_schema.tables where table_schema=‘数据库名‘ AND table_name=‘表名‘;4.查看某个数据库所有表的大小select table_name,concat(round(sum(DATA_LENGTH/1024/1024),2),‘M‘) from information_schema.tables where table_schema=‘t1‘ group by table_name;5.查看库的大小,剩余空间的大小select table_schema,round((sum(data_length / 1024 / 1024) + sum(index_length / 1024 / 1024)),2) dbsize,round(sum(DATA_FREE / 1024 / 1024),2) freesize, round((sum(data_length / 1024 / 1024) + sum(index_length / 1024 / 1024)+sum(DATA_FREE / 1024 / 1024)),2) spsize from information_schema.tables where table_schema not in (‘mysql‘,‘information_schema‘,‘performance_schema‘) group by table_schema order by freesize desc;6.查找关于锁select r.trx_id waiting_trx_id,r.trx_mysql_thread_id waiting_thread,r.trx_query waiting_query,b.trx_id blocking_trx_id,b.trx_mysql_thread_id blocking_thread,b.trx_query blocking_query from information_schema.innodb_lock_waits w inner join information_schema.innodb_trx b on b.trx_id = w.blocking_trx_id inner join information_schema.innodb_trx r on r.trx_id = w.requesting_trx_idGinformation_schema的使用1.查看各个库下的表数据大小select table_name,concat(round(sum(DATA_LENGTH/1024/1024),2),‘M‘) from information_schema.tables where table_schema=‘db_name‘ group by table_name;2.查看各个数据库的数据大小select TABLE_SCHEMA, concat(round(sum(data_length)/1024/1024,2),‘ MB‘) as data_size from information_schema.tables group by table_schema;3.查看实例有没有主键select table_schema,table_name from information_schema.tables where (table_schema,table_name) not in(select distinct table_schema,table_name from information_schema.STATISTICS where INDEX_NAME=‘PRIMARY‘ ) and table_schema not in ( ‘sys‘,‘mysql‘,‘information_schema‘,‘performance_schema‘);4.查看实例中哪些字段可以为nullselect TABLE_SCHEMA,TABLE_NAME from COLUMNS where IS_NULLABLE=‘YES‘ and TABLE_SCHEMA not in (‘information_schema‘,‘performance_schema‘,‘mysql‘, ‘sys‘)G5.查看实例中有哪些存储过程和函数#存储过程select ROUTINE_SCHEMA,ROUTINE_NAME,ROUTINE_TYPEfrom information_schema.ROUTINESwhere ROUTINE_TYPE=‘PROCEDURE‘ and ROUTINE_SCHEMA not in (‘mysql‘,‘sys‘,‘information_schema‘,‘performance_schema‘);#函数select ROUTINE_SCHEMA,ROUTINE_NAME,ROUTINE_TYPE from information_schema.ROUTINES where ROUTINE_TYPE=‘FUNCTION‘ and ROUTINE_SCHEMA not in (‘mysql‘,‘sys‘,‘information_schema‘,‘performance_schema‘);6.查看实例中哪些表字段字符集和默认字符集不一致select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,CHARACTER_SET_NAME from information_schema.COLUMNS where (CHARACTER_SET_NAME is null or CHARACTER_SET_NAME <> ‘utf8‘) and TABLE_SCHEMA not in (‘information_schema‘,‘performance_schema‘,‘test‘,‘mysql‘,‘sys‘);7.查看实例中哪些表字段字符校验规则和默认的不一致查看当前字符集和校对规则设置show variables like ‘collation_%‘;select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,CHARACTER_SET_NAME,COLLATION_NAME from information_schema.COLUMNS where (COLLATION_NAME is null or COLLATION_NAME <> ‘utf8_general_ci‘) and TABLE_SCHEMA not in (‘information_schema‘,‘performance_schema‘,‘test‘,‘mysql‘,‘sys‘);8.查看哪些账号有除了select、update、insert以外的权限select GRANTEE,PRIVILEGE_TYPE,concat(TABLE_SCHEMA,‘-‘,TABLE_NAME,‘-‘,COLUMN_NAME) from COLUMN_PRIVILEGES where PRIVILEGE_TYPE not in (‘select‘,‘insert‘,‘update‘)union select GRANTEE,PRIVILEGE_TYPE,TABLE_SCHEMA from SCHEMA_PRIVILEGES where PRIVILEGE_TYPE not in (‘select‘,‘insert‘,‘update‘)unionselect GRANTEE,PRIVILEGE_TYPE,concat(TABLE_SCHEMA,‘-‘,TABLE_NAME) from TABLE_PRIVILEGES where PRIVILEGE_TYPE not in (‘select‘,‘insert‘,‘update‘) unionselect GRANTEE,PRIVILEGE_TYPE,concat(‘user‘) from USER_PRIVILEGES where PRIVILEGE_TYPE not in (‘select‘,‘insert‘,‘update‘);9.查看实例中哪些表不是默认存储引擎,以默认存储引擎为innodb为例select TABLE_NAME,ENGINE from information_schema.tables where ENGINE!=‘innodb‘ and TABLE_SCHEMA not in (‘information_schema‘,‘performance_schema‘,‘test‘,‘mysql‘, ‘sys‘);10.查看实例中哪些表有外键select a.TABLE_SCHEMA,a.TABLE_NAME,a.CONSTRAINT_TYPE,a.CONSTRAINT_NAME,b.REFERENCED_TABLE_NAME,b.REFERENCED_COLUMN_NAME from information_schema.TABLE_CONSTRAINTS a LEFT JOIN information_schema.KEY_COLUMN_USAGE b ON a.CONSTRAINT_NAME=b.CONSTRAINT_NAME where a.CONSTRAINT_TYPE=‘FOREIGN KEY‘;11.查看实例中哪些表字段有级联更新select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,REFERENCED_TABLE_SCHEMA,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME from information_schema.KEY_COLUMN_USAGE where REFERENCED_TABLE_SCHEMA is not null and REFERENCED_TABLE_NAME is not null and REFERENCED_COLUMN_NAME is not null and table_schema not in (‘information_schema‘,‘performance_schema‘,‘test‘,‘mysql‘, ‘sys‘);12.如何根据用户名、连接时间、执行的sql等过滤当前实例中的连接信息select USER,HOST,DB from processlist where TIME>2;13.查看数据库中没有索引的表select TABLE_SCHEMA,TABLE_NAME from information_schema.tables where TABLE_NAME not in (select distinct(any_value(TABLE_NAME)) from information_schema.STATISTICS group by INDEX_NAME) and TABLE_SCHEMA not in (‘sys‘,‘mysql‘,‘information_schema‘,‘performance_schema‘);14.查看数据库中有索引的表,建立了哪些索引显示结果:库名、表名、索引名select TABLE_SCHEMA,TABLE_NAME,group_concat(INDEX_NAME) from information_schema.STATISTICS where TABLE_SCHEMA not in (‘sys‘,‘mysql‘,‘information_schema‘,‘performance_schema‘) group by TABLE_NAME ;

PostgreSql如何查询指定schema下的所有函数信息,以及函数DDL语句和参数信息,用sql实现查询?

SELECT routines.routine_name, parameters.data_type, parameters.ordinal_positionFROM information_schema.routines JOIN information_schema.parameters ON routines.specific_name=parameters.specific_nameWHERE routines.specific_schema="my_specified_schema_name"ORDER BY routines.routine_name, parameters.ordinal_position;这个sql语句可以查询出来你所有的函数,已经函数中对应的参数,"my_specified_schema_name"换成你对应的schema名字.

mysql中如何查看数据库表的创建时间

第一步:mysql> USE information_schema;第二步:mysql> SELECT create_time FROM TABLES WHERE table_name = "Course";

Cu/XLPE/SWA/PVC16 sqmm 4C+E 是什么意思?4C+E是什么意思

Cu 铜线XLPE。是聚乙烯 PVC是聚氯乙烯 SWA是钢带 铜芯聚乙烯绝缘聚氯乙烯护套(钢带)铠装电力电缆16sqmm.每根线截面积16平方毫米,4C+E,4芯+(中间)1芯

几个防SQL注入攻击函数的区别

SQL注入攻击是黑客攻击网站最常用的手段。如果你的站点没有使用严格的用户输入检验,那么常容易遭到SQL注入攻击。SQL注入攻击通常通过给站点数据库提交不良的数据或查询语句来实现,很可能使数据库中的纪录遭到暴露,更改或被删除。为了防止SQL注入攻击,PHP自带一个功能可以对输入的字符串进行处理,可以在较底层对输入进行安全上的初步处理,也即Magic Quotes。(php.ini magic_quotes_gpc)。如果magic_quotes_gpc选项启用,那么输入的字符串中的单引号,双引号和其它一些字符前将会被自动加 上反斜杠/。但Magic Quotes并不是一个很通用的解决方案,没能屏蔽所有有潜在危险的字符,并且在许多服务器上Magic Quotes并没有被启用。所以,我们还需要使用其它多种方法来防止SQL注入。许多数据库本身就提供这种输入数据处理功能。例如PHP的MySQL操作函数中有addslashes()、 mysql_real_escape_string()、mysql_escape_string()等函数,可将特殊字符和可能引起数据库操作出错的字 符转义。那么这三个功能函数之间有什么却别呢?下面我们就来详细讲述下。虽然国内很多PHP程序员仍在依靠addslashes防止SQL注入,还是建议大家加强中文防止SQL注入的检查。addslashes的问题在 于黑客 可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,成为一个有效的多字节字符,其中的0xbf5c仍会 被看作是单引号,所以addslashes无法成功拦截。当然addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧。另外对于php手册中get_magic_quotes_gpc的举例:if (!get_magic_quotes_gpc()) {$lastname = addslashes($_POST[‘lastname"]);} else {$lastname = $_POST[‘lastname"];}最好对magic_quotes_gpc已经开放的情况下,还是对$_POST["lastname"]进行检查一下。再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用。否则只能用 mysql_escape_string ,两者的区别是:mysql_real_escape_string 考虑到连接的当前字符集,而mysql_escape_string 不考虑。总结一下:* addslashes() 是强行加/;* mysql_real_escape_string() 会判断字符集,但是对PHP版本有要求;* mysql_escape_string不考虑连接的当前字符集。dz中的防止sql注入就是用addslashes这个函数,同时在dthmlspecialchars这个函数中有进行一些替换$string = preg_replace("/&((#(/d{3,5}|x[a-fA-F0-9]{4}));)/", "&//1",这个替换解决了注入的问题,同时也解决了中文乱码的一些问题推荐学习:PHP视频教程

请问SQL模式:ANSI_QUOTES具体有什么特殊用途?

ANSI是SQL的通用标准,QUOTES是指用什么符号来引用对象。ANSI_QUOTES就是标准的SQL引用方式,不同数据库在一些单双引号,as别名,对象名等方面符号注明不同。一般尽量使用ANSI标准,以保证代码通用,别人也能看得懂。

cssquotes属性怎么用

css quotes属性用于设置嵌套引用的引号类型。所有主流浏览器都支持quotes属性,但IE8需要定义!DOCTYPE才支持quotes属性。css quotes属性怎么用?quotes属性设置嵌套引用(embedded quotation)的引号类型。可以设置的属性值:●none:规定 "content" 属性的 "open-quote" 和 "close-quote" 的值不会产生任何引号。●string string string string:定义要使用的引号。前两个值规定第一级引用嵌套,后两个值规定下一级引号嵌套。●inherit 规定应该从父元素继承 quotes 属性的值。引号字符说明:所有浏览器都支持 quotes 属性。注释:如果已规定 !DOCTYPE,那么 Internet Explorer 8 (以及更高版本)支持 quotes 属性。css quotes属性 示例<!DOCTYPE><html><head><meta charset="utf-8"> <style type="text/css">q:lang(en){quotes: """ """ """ """}</style></head><body><p><q>This is a <q>big</q> quote.</q></p><p><b>注释:</b>如果已规定 !DOCTYPE,那么 Internet Explorer 8 (以及更高版本)支持 quotes 属性。</p></body></html>效果图:

请问SQL模式:ANSI_QUOTES具体有什么特殊用途?

ANSI是SQL的通用标准,QUOTES是指用什么符号来引用对象。ANSI_QUOTES就是标准的SQL引用方式,不同数据库在一些单双引号,as别名,对象名等方面符号注明不同。一般尽量使用ANSI标准,以保证代码通用,别人也能看得懂。

Mac OS X 平台上有哪些好用且免费的MySQL客户端工具

推荐一个GUI工具,Sequel Pro或者直接使用phpmyadmin

「MySQL」这个词怎么读?

My S-Q-L,不专业的可以读作 my sequel(希扣),但绝非是 卖塞科儿其实很多老师并不知道他的读法,当时联系的数据库是dbase, foxbase, foxpro, access, MS SQL server (oracle), 15年前,mysql类似于幼儿园的游戏。此外,SQL server还被用于遵从SQL 92.99标准,在这方面mysql不太正式,因此您可以看到事务隔离级别。这样也很不错,mysql有很多非正式的,但更为方便的语法。具体可以看他的专业书。MySQL包含许多特性,特别是在MySQL 5.0和5.1中,添加了一些主要特性和特性。MySQL的特定功能或语句非常丰富。这就是为什么MySQL核心技术手册(版本2)是有价值的。“MySQL核心技术手册(第二版)”“需要让读者快速找到具体的细节,无论是SQL关键字还是MySQL命令行选项,特定的API信息或实用程序管理。《“MySQL核心技术手册(第二版)”“覆盖适用于所有命令和MySQL 5.1版本的编程信息,包括一些新特性和语言界面,对于大多数语句和函数,使用示例给出。MySQL核心技术手册(版本2)为MySQL语句、函数、配置选项和实用程序提供了完整的手册。为了帮助初学者入门,我们提供了一些教程。为PHP、Perl和C语言提供了应用程序编程接口(api)。在每个章节的API开头提供了一个简要的指南。新副本、触发器和存储过程部分。提供了一些MySQL的实际示例。一些有用的技巧可以帮助读者克服困难。

mysql英文怎么读

就是读 my S Q L 啊

SQL查询语句是什么?

是一种操作数据库的语言 ...

sql怎么读?

读:S - Q - L 或读: /u02c8siu02d0kwu0259l/ ,而/"si:kwu0259l/其实是sequel单词的读音。sql一般指结构化查询语言。结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。结构化查询语言包含6个部分:1、数据查询语言(DQL: Data Query Language):其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其它类型的SQL语句一起使用。2、数据操作语言(DML:Data Manipulation Language):其语句包括动词INSERT、UPDATE和DELETE。它们分别用于添加、修改和删除。3、事务控制语言(TCL):它的语句能确保被DML语句影响的表的所有行及时得以更新。包括COMMIT(提交)命令、SAVEPOINT(保存点)命令、ROLLBACK(回滚)命令。4、数据控制语言(DCL):它的语句通过GRANT或REVOKE实现权限控制,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。5、数据定义语言(DDL):其语句包括动词CREATE,ALTER和DROP。在数据库中创建新表或修改、删除表(CREATE TABLE 或 DROP TABLE);为表加入索引等。6、指针控制语言(CCL):它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。

几个不错的免费MySQL管理工具_MySQL

bitsCN.com MySQL以其简单易用,功能强大赢得了很多开发人员的喜爱,伴随Web 2.0浪潮,MySQL也正经历着前所未有的黄金时段,使用各种精心设计的工具来管理MySQL数据库要比单纯使用传统的方法轻松得的多,开发人员应该不断寻找那些能够缩短开发时间的工具。 但笔者一直在寻找一款满意的MySQL管理工具,并且要是开源或免费,因此诞生了本文,笔者为本文起名为:10个最好的免费MySQL管理工具,但是编者认为世上之物,没有最好,只有更好。不过笔者介绍的几款免费的MySQL管理工具还是很好的,希望这些工具能帮助开发人员和MySQL数据库维护人员简化工作,提高效率。 一、MySQL Workbench MySQL Workbench是一个由MySQL开发的跨平台、可视化数据库工具。它作为DBDesigner4工程的替代应用程序而备受瞩目。MySQL Workbench可以作为windows、linux和OS X系统上的原始GUI工具,它有各种不同的版本,你可以查看下面的链接以获得它的版本信息。 二、phpMyAdmin phpMyAdmin是一款免费的、用PHP编写的工具,用于在万维网上管理MySQL,它支持MySQL的大部分功能。这款含有用户界面的软件能够支持一些最常用的操作(比如管理数据库、表格、字段、联系、索引、用户、许可,等等),同时你还可以直接执行任何SQL语句。 它所具备的特性: >直观的Web界面 >支持大多数MySQL功能: > 浏览和丢弃数据库、表格、视图、字段和索引 >创建、复制、删除、重命名以及更改数据库、表格、字段和索引 >维护服务器、数据库以及表格,能对服务器的配置提出建议 >执行、编辑和标注任何SQL语句,甚至批量查询 >管理MySQL用户以及用户权限 >管理存储的过程(stored procedures)和触发器(triggers) >从CSV 和 SQL文件格式中导入数据 >能够以多种格式导出数据:CSV、SQL、XML、PDF、ISO/IEC 26300等 >管理多台服务器 >为数据库布局创建PDF图表 >使用Query-by-example (QBE)创建复杂的查询 >在数据库中进行全局搜索,或者在数据库的子集中进行搜索 >用预定义的函数把存储的数据转化成任何格式 >还具有其他更多特性... 三、Aqua Data Studio 对于数据库管理人员、软件开发人员以及业务分析师来说,Aqua Data Studio是一个完整的集成开发环境(IDE)。它主要具备了四个方面的功能:1)数据库查询和管理工具;2)一套数据库、源代码管理以及文件系统的比较工具;3)为Subversion(SVN)和CVS而设计了一个完整的集成源代码管理客户端;4)提供了一个的数据库建模工具(modeler),它和最好的独立数据库图表工具一样强大。 四、SQLyog SQLyog是一个全面的MySQL数据库管理工具(/u2018GUIu2019/"Frontendu2018)。 它的社区版(Community Edition)是具有GPL许可的免费开源软件。这款工具包含了开发人员在使用MySQL时所需的绝大部分功能:查询结果集合、查询分析器、服务器消息、表格数据、表格信息,以及查询历史,它们都以标签的形式显示在界面上,开发人员只要点击鼠标即可。此外,它还可以方便地创建视图和存储过程,最近几周笔者一直在反复使用这个功能。 五、MYSQL Front 这个MySQL数据库的图形GUI是一个“真正的”应用程序,它提供的用户界面比用PHP和HTML建立起来的系统更加精确。因为不会因为重载HTML网页而导致延时,所以它的响应是即时的。如果供应商允许的话,你可以让MySQL-Front直接与数据库进行工作。如果不行,你也只需要在发布网站上安装一个小的脚本即可。登录信息会存储在你的硬盘上,因此你不必再登录到不同的网络界面上了。 六、mytop mytop是一款基于控制台的工具(不是GUI),用于监视线程以及MySQL 3.22.x、3.23.x和4.x服务器的整体性能。它可以在大多数安装了Perl、DBI以及 Term::ReadKey的Unix系统上(包括Mac系统OS X)运行。如果你安装了Term::ANSIColor,你能得到彩色的视图。如果你安装了Time::HiRes,你还可以得到一个不错的 “每秒查询数” 实时统计。mytop0.7版甚至还能在windows上运行。 mytop的灵感来自系统监视工具“top”。我经常在Linux、FreeBSD和Solaris上使用top,你很可能会在mytop中注意到来自这些操作系统的某些特性。mytop连接到MySQL服务器之后,能定期运行SHOW PROCESSLIST和SHOW STATUS命令,并以一种有用的格式总结从这些命令中所获得的信息。 七、Sequel Pro Sequel Pro是一款管理MAC OSX数据库的应用程序,它可以让你直接访问本地以及远程服务器上的MySQL数据库,并且支持从流行的文件格式中导入和导出数据,其中包括SQL、CSV 和XML等文件。最初,Sequel Pro只是开源CocoaMySQL工程的一个分支。部分特性如下: >你很容易就可以建立起一个到Mac电脑本地MySQL服务器的连接 >它具有全部的表格管理功能,包括索引。 >支持MySQL视图 >它使用多窗口功能,能够立即支持多个数据库或表格 八、SQL Buddy SQL Buddy是一个强大的轻量级Ajax数据库管理工具。它非常易于安装,你只需要把文件夹解压到服务器里就行了,这再简单不过了!你还可以进行常见的绝大部分操作。这个工具还有许多有用的快捷键,你可以从这里查看:SQL Buddy Keyboard Shortcuts. 九、MySQL Sidu MySQL Sidu是一款免费的MySQL客户端,它通过网络浏览器来运行,非常容易上手!Sidu这几个字母表示Select(选择)、Insert(插入)、Delete(删除)和Update(更新)。Sidu其实还有更多的功能,它看起来更像MySQL前端软件的GUI而不是网页。 >SIDU支持SQL选择、插入、删除,更新功能。 >SIDU支持在浏览器上工作,如Firefox、IE、Opera、Safari、Chrome等等。 >SIDU看起来像MySQL前端软件的GUI而不是网页。 >SIDU可以跟MySQL、Postgres 和SQLite DBs一起工作。 十、Navicat Lite MySQL Admin Tool Navicat是一款快速、可靠的数据库管理工具,很受大家的欢迎。Navicat专门用来简化数据库管理并且减少管理成本,它旨在满足数据库管理人员、数据库开发人员以及广大中小企业的需要,它有一个很直观的GUI,可以让你安全便捷的创建、组织、访问以及分享信息。 对于MySQL来说,Navicat工具是一个强大的数据库管理和开发工具。它可以跟任何版本的MySQL数据库服务器(3.21版或者以上版本)一起工作,并且支持MySQL大多数最新的功能,包括Trigger、Stored Procedure、Function、Event, View和 Manage User等。Navicat Lite可以免费下载,但是仅适用于非商业活动。 bitsCN.com

sql怎么读 sql的读音和解释

1、sql读:S - Q - L;或读: /u02c8siu02d0kwu0259l/ ;/si:kwu0259l/其实是sequel单词的读音。 2、SQL的前身是Structured English QUEry Language,前身以sequel单词作为的别名(这个巧妙的别名据说当初花了超过两个工作日的会议才确定下来)。后来衍生出SEQUEL/2,也就是现在的SQL(Structured Query Language)。

sequel 什么连接不上mysql

1.在dos下运行mysql -u root -p 注意最好在mysql.exe所在目录下运行 mysql -u root -p 123456 show databases 列出所有数据库 看看mysql是不是真的运行起来了 2.用你的代码看看php是不是能连上正常运行的msyql 如果连不上,看php_mysql.dll 文件不没有 undefined function mysql_pconnect() 是说没有这个函数, 这是php_mysql.dll 里提供的函数 php5好像是用php_mysqli.dll extension=php_mysqli.dll 然后是那么你的mysql版本是?如果是3.x,那么将该目录下的my-example复制到c盘根目录下,并重命名为my如果是4.x,将该目录下的my-*(指任意一个)复制到c盘根目录下,并重新命名然后编辑这个文件,修改相关的路径

什么是SQL?是哪几个单词的缩写?

StructuredQueryLanguage结构化查询语言现在的SQL更多的是StructuredEnglishQueryLauguage的简称(类英语的结构化查询语言)用于数据库查询、数据操纵等功能的实现。

如何在sequel导出mysql数据库的数据库

oracle exp命令批量导出数据库的方法:1 假如数据库名为:TEST 、,用户名system 密码manager 导出到D:/daochu.dmp中 exp system/manager@TEST file=d:/daochu.dmp full=y如果要导出指定的表,方法如下:假如要导出数据库中的表"CHA%"导出exp aichannel/aichannel@TESTDB2 file= d:/data/newsmgnt.dmp owner=(PRO) tables=(PRO.CHA%

外国人怎么念SQL ?要标准的美式英语念法

S,Q,L一个一个字母地读

sql行内人怎么读

sequel。根据查询相关信息可知,行内人一般都用sequel代表sql。SQL是具有数据操纵和数据定义等多种功能的数据库语言,这种语言具有交互性特点,能为用户提供极大的便利,数据库管理系统应充分利用SQL语言提高计算机应用系统的工作质量与效率。

lemonade 与lemon squash的区别

Lemonade柠檬水;lemon squash柠檬果汁

SQL语句执行流程与顺序原理解析

SQL语句执行流程与顺序原理解析Oracle语句执行流程第一步:客户端把语句发给服务器端执行当我们在客户端执行SQL语句时,客户端会把这条SQL语句发送给服务器端,让服务器端的进程来处理这语句。也就是说,Oracle 客户端是不会做任何的操作,他的主要任务就是把客户端产生的一些SQL语句发送给服务器端。服务器进程从用户进程把信息接收到后, 在PGA 中就要此进程分配所需内存,存储相关的信息,如:在会话内存存储相关的登录信息等。虽然在客户端也有一个数据库进程,但是,这个进程的作用跟服务器上的进程作用是不相同的,服务器上的数据库进程才会对SQL 语句进行相关的处理。不过,有个问题需要说明,就是客户端的进程跟服务器的进程是一一对应的。也就是说,在客户端连接上服务器后,在客户端与服务器端都会形成一个进程,客户端上的我们叫做客户端进程,而服务器上的我们叫做服务器进程。第二步:语句解析当客户端把SQL语句传送到服务器后,服务器进程会对该语句进行解析。这个解析的工作是在服务器端所进行的,解析动作又可分为很多小动作。1)查询高速缓存(library cache)服务器进程在接到客户端传送过来的SQL语句时,不会直接去数据库查询。服务器进程把这个SQL语句的字符转化为ASCII等效数字码,接着这个ASCII码被传递给一个HASH函数,并返回一个hash值,然后服务器进程将到shared pool中的library cache(高速缓存)中去查找是否存在相同的hash值。如果存在,服务器进程将使用这条语句已高速缓存在SHARED POOL的library cache中的已分析过的版本来执行,省去后续的解析工作,这便是软解析。若调整缓存中不存在,则需要进行后面的步骤,这便是硬解析。硬解析通常是昂贵的操作,大约占整个SQL执行的70%左右的时间,硬解析会生成执行树,执行计划,等等。所以,采用高速数据缓存的话,可以提高SQL 语句的查询效率。其原因有两方面:一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高,另一方面也是因为避免语句解析而节省了时间。不过这里要注意一点,这个数据缓存跟有些客户端软件的数据缓存是两码事。有些客户端软件为了提高查询效率,会在应用软件的客户端设置数据缓存。由于这些数据缓存的存在,可以提高客户端应用软件的查询效率。但是,若其他人在服务器进行了相关的修改,由于应用软件数据缓存的存在,导致修改的数据不能及时反映到客户端上。从这也可以看出,应用软件的数据缓存跟数据库服务器的高速数据缓存不是一码事。2)语句合法性检查(data dict cache)当在高速缓存中找不到对应的SQL语句时,则服务器进程就会开始检查这条语句的合法性。这里主要是对SQL语句的语法进行检查,看看其是否合乎语法规则。如果服务器进程认为这条SQL语句不符合语法规则的时候,就会把这个错误信息反馈给客户端。在这个语法检查的过程中,不会对SQL语句中所包含的表名、列名等等进行检查,只是检查语法。3)语言含义检查(data dict cache)若SQL 语句符合语法上的定义的话,则服务器进程接下去会对语句中涉及的表、索引、视图等对象进行解析,并对照数据字典检查这些对象的名称以及相关结构,看看这些字段、表、视图等是否在数据库中。如果表名与列名不准确的话,则数据库会就会反馈错误信息给客户端。所以,有时候我们写select语句的时候,若语法与表名或者列名同时写错的话,则系统是先提示说语法错误,等到语法完全正确后再提示说列名或表名错误。4)获得对象解析锁(control structer)当语法、语义都正确后,系统就会对我们需要查询的对象加锁。这主要是为了保障数据的一致性,防止我们在查询的过程中,其他用户对这个对象的结构发生改变。5)数据访问权限的核对(data dict cache)当语法、语义通过检查之后,客户端还不一定能够取得数据,服务器进程还会检查连接用户是否有这个数据访问的权限。若用户不具有数据访问权限的话,则客户端就不能够取得这些数据。要注意的是数据库服务器进程先检查语法与语义,然后才会检查访问权限。6)确定最佳执行计划当语法与语义都没有问题权限也匹配,服务器进程还是不会直接对数据库文件进行查询。服务器进程会根据一定的规则,对这条语句进行优化。在执行计划开发之前会有一步查询转换,如:视图合并、子查询解嵌套、谓语前推及物化视图重写查询等。为了确定采用哪个执行计划,Oracle还需要收集统计信息确定表的访问联结方法等,最终确定可能的最低成本的执行计划。不过要注意,这个优化是有限的。一般在应用软件开发的过程中,需要对数据库的sql语句进行优化,这个优化的作用要大大地大于服务器进程的自我优化。当服务器进程的优化器确定这条查询语句的最佳执行计划后, 就会将这条SQL语句与执行计划保存到数据高速缓存(library cache)。如此,等以后还有这个查询时,就会省略以上的语法、语义与权限检查的步骤,而直接执行SQL语句,提高SQL语句处理效率。第三步:绑定变量赋值如果SQL语句中使用了绑定变量,扫描绑定变量的声明,给绑定变量赋值,将变量值带入执行计划。若在解析的第一个步骤,SQL在高速缓冲中存在,则直接跳到该步骤。第四步:语句执行语句解析只是对SQL语句的语法进行解析,以确保服务器能够知道这条语句到底表达的是什么意思。等到语句解析完成之后,数据库服务器进程才会真正的执行这条SQL语句。对于SELECT语句:1)首先服务器进程要判断所需数据是否在db buffer存在,如果存在且可用,则直接获取该数据而不是从数据库文件中去查询数据,同时根据LRU 算法增加其访问计数;2)若数据不在缓冲区中,则服务器进程将从数据库文件中查询相关数据,并把这些数据放入到数据缓冲区中(buffer cache)。其中,若数据存在于db buffer,其可用性检查方式为:查看db buffer块的头部是否有事务,如果有事务,则从回滚段中读取数据;如果没有事务,则比较select的scn和db buffer块头部的scn,如果前者小于后者,仍然要从回滚段中读取数据;如果前者大于后者,说明这是一非脏缓存,可以直接读取这个db buffer块的中内容。对于DML语句(insert、delete、update):1)检查所需的数据库是否已经被读取到缓冲区缓存中。如果已经存在缓冲区缓存,则直接执行步骤3;2)若所需的数据库并不在缓冲区缓存中,则服务器将数据块从数据文件读取到缓冲区缓存中;3)对想要修改的表取得的数据行锁定(Row Exclusive Lock),之后对所需要修改的数据行取得独占锁;4)将数据的Redo记录复制到redo log buffer;5)产生数据修改的undo数据;6)修改db buffer;7)dbwr将修改写入数据文件;其中,第2步,服务器将数据从数据文件读取到db buffer经经历以下步骤:1)首先服务器进程将在表头部请求TM锁(保证此事务执行过程其他用户不能修改表的结构),如果成功加TM锁,再请求一些行级锁(TX锁),如果TM、TX锁都成功加锁,那么才开始从数据文件读数据。2)在读数据之前,要先为读取的文件准备好buffer空间。服务器进程需要扫描LRU list寻找free db buffer,扫描的过程中,服务器进程会把发现的所有已经被修改过的db buffer注册到dirty list中。如果free db buffer及非脏数据块缓冲区不足时,会触发dbwr将dirty buffer中指向的缓冲块写入数据文件,并且清洗掉这些缓冲区来腾出空间缓冲新读入的数据。3)找到了足够的空闲buffer,服务器进程将从数据文件中读入这些行所在的每一个数据块(db block)(DB BLOCK是ORACLE的最小操作单元,即使你想要的数据只是DB BLOCK中很多行中的一行或几行,ORACLE也会把这个DB BLOCK中的所有行都读入Oracle DB BUFFER中)放入db buffer的空闲的区域或者覆盖已被挤出LRU list的非脏数据块缓冲区,并且排列在LRU列表的头部,也就是在数据块放入db buffer之前也是要先申请db buffer中的锁存器,成功加锁后,才能读数据到db buffer。若数据块已经存在于db buffer cache(有时也称db buffer或db cache),即使在db buffer中找到一个没有事务,而且SCN比自己小的非脏缓存数据块,服务器进程仍然要到表的头部对这条记录申请加锁,加锁成功才能进行后续动作,如果不成功,则要等待前面的进程解锁后才能进行动作(这个时候阻塞是tx锁阻塞)。在记redo日志时,其具体步骤如下:1)数据被读入到db buffer后,服务器进程将该语句所影响的并被读入db buffer中的这些行数据的rowid及要更新的原值和新值及scn等信息从PGA逐条的写入redo log buffer中。在写入redo log buffer之前也要事先请求redo log buffer的锁存器,成功加锁后才开始写入。2)当写入达到redo log buffer大小的三分之一或写入量达到1M或超过三秒后或发生检查点时或者dbwr之前发生,都会触发lgwr进程把redo log buffer的数据写入磁盘上的redo file文件中(这个时候会产生log file sync等待事件)。3)已经被写入redo file的redo log buffer所持有的锁存器会被释放,并可被后来的写入信息覆盖,redo log buffer是循环使用的。Redo file也是循环使用的,当一个redo file写满后,lgwr进程会自动切换到下一redo file(这个时候可能出现log file switch(check point complete)等待事件)。如果是归档模式,归档进程还要将前一个写满的redo file文件的内容写到归档日志文件中(这个时候可能出现log file switch(archiving needed)。在为事务建立undo信息时,其具体步骤如下:1)在完成本事务所有相关的redo log buffer之后,服务器进程开始改写这个db buffer的块头部事务列表并写入scn(一开始scn是写在redo log buffer中的,并未写在db buffer)。2)然后copy包含这个块的头部事务列表及scn信息的数据副本放入回滚段中,将这时回滚段中的信息称为数据块的“前映像”,这个“前映像”用于以后的回滚、恢复和一致性读。(回滚段可以存储在专门的回滚表空间中,这个表空间由一个或多个物理文件组成,并专用于回滚表空间,回滚段也可在其它表空间中的数据文件中开辟)。在修改信息写入数据文件时,其具体步骤如下:1)改写db buffer块的数据内容,并在块的头部写入回滚段的地址。2)将db buffer指针放入dirty list。如果一个行数据多次update而未commit,则在回滚段中将会有多个“前映像”,除了第一个“前映像”含有scn信息外,其他每个"前映像"的头部都有scn信息和"前前映像"回滚段地址。一个update只对应一个scn,然后服务器进程将在dirty list中建立一条指向此db buffer块的指针(方便dbwr进程可以找到dirty list的db buffer数据块并写入数据文件中)。接着服务器进程会从数据文件中继续读入第二个数据块,重复前一数据块的动作,数据块的读入、记日志、建立回滚段、修改数据块、放入dirty list。3)当dirty queue的长度达到阀值(一般是25%),服务器进程将通知dbwr把脏数据写出,就是释放db buffer上的锁存器,腾出更多的free db buffer。前面一直都是在说明oracle一次读一个数据块,其实oracle可以一次读入多个数据块(db_file_multiblock_read_count来设置一次读入块的个数)当执行commit时,具体步骤如下:1)commit触发lgwr进程,但不强制dbwr立即释放所有相应db buffer块的锁。也就是说有可能虽然已经commit了,但在随后的一段时间内dbwr还在写这条sql语句所涉及的数据块。表头部的行锁并不在commit之后立即释放,而是要等dbwr进程完成之后才释放,这就可能会出现一个用户请求另一用户已经commit的资源不成功的现象。2)从Commit和dbwr进程结束之间的时间很短,如果恰巧在commit之后,dbwr未结束之前断电,因为commit之后的数据已经属于数据文件的内容,但这部分文件没有完全写入到数据文件中。所以需要前滚。由于commit已经触发lgwr,这些所有未来得及写入数据文件的更改会在实例重启后,由smon进程根据重做日志文件来前滚,完成之前commit未完成的工作(即把更改写入数据文件)。3)如果未commit就断电了,因为数据已经在db buffer更改了,没有commit,说明这部分数据不属于数据文件。由于dbwr之前触发lgwr也就是只要数据更改,(肯定要先有log)所有dbwr在数据文件上的修改都会被先一步记入重做日志文件,实例重启后,SMON进程再根据重做日志文件来回滚。其实smon的前滚回滚是根据检查点来完成的,当一个全部检查点发生的时候,首先让LGWR进程将redologbuffer中的所有缓冲(包含未提交的重做信息)写入重做日志文件,然后让dbwr进程将dbbuffer已提交的缓冲写入数据文件(不强制写未提交的)。然后更新控制文件和数据文件头部的SCN,表明当前数据库是一致的,在相邻的两个检查点之间有很多事务,有提交和未提交的。当执行rollback时,具体步骤如下:服务器进程会根据数据文件块和db buffer中块的头部的事务列表和SCN以及回滚段地址找到回滚段中相应的修改前的副本,并且用这些原值来还原当前数据文件中已修改但未提交的改变。如果有多个”前映像“,服务器进程会在一个“前映像”的头部找到“前前映像”的回滚段地址,一直找到同一事务下的最早的一个“前映像”为止。一旦发出了commit,用户就不能rollback,这使得commit后dbwr进程还没有全部完成的后续动作得到了保障。第五步:提取数据当语句执行完成之后,查询到的数据还是在服务器进程中,还没有被传送到客户端的用户进程。所以,在服务器端的进程中,有一个专门负责数据提取的一段代码。他的作用就是把查询到的数据结果返回给用户端进程,从而完成整个查询动作。从这整个查询处理过程中,我们在数据库开发或者应用软件开发过程中,需要注意以下几点:  一是要了解数据库缓存跟应用软件缓存是两码事情。数据库缓存只有在数据库服务器端才存在,在客户端是不存在的。只有如此,才能够保证数据库缓存中的内容跟数据库文件的内容一致。才能够根据相关的规则,防止数据脏读、错读的发生。而应用软件所涉及的数据缓存,由于跟数据库缓存不是一码事情,所以,应用软件的数据缓存虽然可以提高数据的查询效率,但是,却打破了数据一致性的要求,有时候会发生脏读、错读等情况的发生。所以,有时候,在应用软件上有专门一个功能,用来在必要的时候清除数据缓存。不过,这个数据缓存的清除,也只是清除本机上的数据缓存,或者说,只是清除这个应用程序的数据缓存,而不会清除数据库的数据缓存。  二是绝大部分SQL语句都是按照这个处理过程处理的。我们DBA或者基于Oracle数据库的开发人员了解这些语句的处理过程,对于我们进行涉及到SQL语句的开发与调试,是非常有帮助的。有时候,掌握这些处理原则,可以减少我们排错的时间。特别要注意,数据库是把数据查询权限的审查放在语法语义的后面进行检查的。所以,有时会若光用数据库的权限控制原则,可能还不能满足应用软件权限控制的需要。此时,就需要应用软件的前台设置,实现权限管理的要求。而且,有时应用数据库的权限管理,也有点显得繁琐,会增加服务器处理的工作量。因此,对于记录、字段等的查询权限控制,大部分程序涉及人员喜欢在应用程序中实现,而不是在数据库上实现。Oracle SQL语句执行顺序(8)SELECT (9) DISTINCT (11) <select_list>(1) FROM <left_table>(3) <join_type> JOIN <right_table>(2) ON <join_condition>(4) WHERE <where_condition>(5) GROUP BY <group_by_list>(6) WITH {CUBE | ROLLUP}(7) HAVING <having_condition>(10) ORDER BY <order_by_list>1)FROM:对FROM子句中的表执行笛卡尔积(交叉联接),生成虚拟表VT1。2)ON:对VT1应用ON筛选器,只有那些使为真才被插入到TV2。3)OUTER (JOIN):如果指定了OUTER JOIN(相对于CROSS JOIN或INNER JOIN),保留表中未找到匹配的行将作为外部行添加到VT2,生成TV3。如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表位置。4)WHERE:对TV3应用WHERE筛选器,只有使为true的行才插入TV4。5)GROUP BY:按GROUP BY子句中的列列表对TV4中的行进行分组,生成TV5。6)CUTE|ROLLUP:把超组插入VT5,生成VT6。7)HAVING:对VT6应用HAVING筛选器,只有使为true的组插入到VT7。8)SELECT:处理SELECT列表,产生VT8。9)DISTINCT:将重复的行从VT8中删除,产品VT9。10)ORDER BY:将VT9中的行按ORDER BY子句中的列列表顺序,生成一个游标(VC10),生成表TV11,并返回给调用者。以上每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只有最后一步生成的表才会会给调用者。如果没有在查询中指定某一个子句,将跳过相应的步骤。

mysql 脏页和redo log 的区别

首先说一下什么叫脏页,就是内存中的数据对应硬盘的数据有所改变.改变后的数据页就叫做脏页.它形成的前后关系以及讲解可以看:上面的博文比较学院化,老子不喜欢,但是讲的很好.我要用我自己的语言重新解释.这个世界是不安全的,盗取无处不在.有一家图书馆,每天都有借出去的书,也有还回来的书,书架上都有标签,还书后还要放回原标签处.某天小姐来借书,借走了"男性生理结构这本书".那么这个书所在的位置就空出来了.这种需要被放回去的书我们称之为脏页.小姐研读完毕,回到图书馆说,我看完了,退书.但是她并不是在哪里拿,在哪里退,而是送回给图书管理员.图书管理员将被还回来的书放到了一个安全的所在,一排排的整理好.最后,等到一天结束或者书量巨大,就将抽出时间将这些书整批整批的放回远处.redo log 和 刷脏页大致的流程就是如此,书就是数据页,被借出的书就是脏页,将来要被放回的.redo 日志就是暂时存放要被放回的书的地方,因为这样会比较快,如果还回一本书放回去一本,就会导致很多的随机写入,而且写入次数十分大.redo log 大小:innodb_log_file_size*innodb_log_files_in_group脏页大小:current LSN - check point LSN脏页最大量:innodb_max_dirty_pages_pct (计算方法:脏页大小/redo log 大小)就是这样,将来还会继续更新与redo log 和脏页之间的现象.

为什么要多个mysql redo log file

用于日志满了切换之用或互相备份之用

一文详解-MySQL 事务和锁

当多个用户访问同一份数据时,一个用户在更改数据的过程中,可能有其他用户同时发起更改请求,为保证数据库记录的更新从一个一致性状态变为另外一个一致性状态,使用事务处理是非常必要的,事务具有以下四个特性: MySQL 提供了多种事务型存储引擎,如 InnoDB 和 BDB 等,而 MyISAM 不支持事务。为了支持事务,InnoDB 存储引擎引入了与事务处理相关的 REDO 日志和 UNDO 日志,同时事务依赖于 MySQL 提供的锁机制 事务执行时需要将执行的事务日志写入日志文件,对应的文件为 REDO 日志。当每条 SQL 进行数据更新操作时,首先将 REDO 日志写进日志缓冲区。当客户端执行 COMMIT 命令提交时,日志缓冲区的内容将被刷新到磁盘,日志缓冲区的刷新方式或者时间间隔可以通过参数 innodb_flush_log_at_trx_commit 控制 REDO 日志对应磁盘上的 ib_logifleN 文件,该文件默认为 5MB,建议设置为 512MB,以便容纳较大的事务。MySQL 崩溃恢复时会重新执行 REDO 日志的记录,恢复最新数据,保证已提交事务的持久性 与 REDO 日志相反,UNDO 日志主要用于事务异常时的数据回滚,具体内容就是记录数据被修改前的信息到 UNDO 缓冲区,然后在合适的时间将内容刷新到磁盘 假如由于系统错误或者 rollback 操作而导致事务回滚,可以根据 undo 日志回滚到没修改前的状态,保证未提交事务的原子性 与 REDO 日志不同的是,磁盘上不存在单独的 UNDO 日志文件,所有的 UNDO 日志均存在表空间对应的 .ibd 数据文件中,即使 MySQL 服务启动了独立表空间 在 MySQL 中,可以使用 BEGIN 开始事务,使用 COMMIT 结束事务,中间可以使用 ROLLBACK 回滚事务。MySQL 通过 SET AUTOCOMMIT、START TRANSACTION、COMMIT 和 ROLLBACK 等语句支持本地事务 MySQL 定义了四种隔离级别,指定事务中哪些数据改变其他事务可见、哪些数据该表其他事务不可见。低级别的隔离级别可以支持更高的并发处理,同时占用的系统资源更少 InnoDB 系统级事务隔离级别可以使用以下语句设置: 查看系统级事务隔离级别: InnoDB 会话级事务隔离级别可以使用以下语句设置: 查看会话级事务隔离级别: 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。读取未提交的数据称为脏读(Dirty Read),即是:首先开启 A 和 B 两个事务,在 B 事务更新但未提交之前,A 事务读取到了更新后的数据,但由于 B 事务回滚,导致 A 事务出现了脏读现象 所有事务只能看见已经提交事务所做的改变,此级别可以解决脏读,但也会导致不可重复读(Nonrepeatable Read):首先开启 A 和 B 两个事务,A事务读取了 B 事务的数据,在 B 事务更新并提交后,A 事务又读取到了更新后的数据,此时就出现了同一 A 事务中的查询出现了不同的查询结果 MySQL 默认的事务隔离级别,能确保同一事务的多个实例在并发读取数据时看到同样的数据行,理论上会导致一个问题,幻读(Phontom Read)。例如,第一个事务对一个表中的数据做了修改,这种修改会涉及表中的全部数据行,同时第二个事务也修改这个表中的数据,这次的修改是向表中插入一行新数据,此时就会发生操作第一个事务的用户发现表中还有没有修改的数据行 InnoDB 通过多版本并发控制机制(MVCC)解决了该问题:InnoDB 通过为每个数据行增加两个隐含值的方式来实现,这两个隐含值记录了行的创建时间、过期时间以及每一行存储时间发生时的系统版本号,每个查询根据事务的版本号来查询结果 通过强制事务排序,使其不可能相互冲突,从而解决幻读问题。简而言之,就是在每个读的数据行上加上共享锁实现,这个级别会导致大量的超时现象和锁竞争,一般不推荐使用 为了解决数据库并发控制问题,如走到同一时刻客户端对同一张表做更新或者查询操作,需要对并发操作进行控制,因此产生了锁 共享锁的粒度是行或者元组(多个行),一个事务获取了共享锁以后,可以对锁定范围内的数据执行读操作 排他锁的粒度与共享锁相同,一个事务获取排他锁以后,可以对锁定范围内的数据执行写操作 有两个事务 A 和 B,如果事务 A 获取了一个元组的共享锁,事务 B 还可以立即获取这个元组的共享锁,但不能获取这个元组的排他锁,必须等到事务 A 释放共享锁之后。如果事务 A 获取了一个元组的排他锁,事务 B 不能立即获取这个元组的共享锁,也不能立即获取这个元组的排他锁,必须等到 A 释放排他锁之后 意向锁是一种表锁,锁定的粒度是整张表,分为意向共享锁和意向排他锁。意向共享锁表示一个事务有意对数据上共享锁或者排他锁。有意表示事务想执行操作但还没真正执行 锁的粒度主要分为表锁和行锁 表锁的开销最小,同时允许的并发量也是最小。MyISAM 存储引擎使用该锁机制。当要写入数据时,整个表记录被锁,此时其他读/写动作一律等待。一些特定的动作,如 ALTER TABLE 执行时使用的也是表锁 行锁可以支持最大的并发,InnoDB 存储引擎使用该锁机制。如果要支持并发读/写,建议采用 InnoDB 存储引擎

如何从MySQL/InnoDB数据文件中的恢复数据

- 恢复策略前面说到未提交的事务和回滚了的事务也会记录Redo Log,因此在进行恢复时,这些事务要进行特殊的的处理.有2中不同的恢复策略: A. 进行恢复时,只重做已经提交了的事务。B. 进行恢复时,重做所有事务包括未提交的事务和回滚了的事务。然后通过Undo Log回滚那些未提交的事务。- InnoDB存储引擎的恢复机制MySQL数据库InnoDB存储引擎使用了B策略, InnoDB存储引擎中的恢复机制有几个特点: A. 在重做Redo Log时,并不关心事务性。 恢复时,没有BEGIN,也没有COMMIT,ROLLBACK的行为。也不关心每个日志是哪个事务的。尽管事务ID等事务相关的内容会记入Redo Log,这些内容只是被当作要操作的数据的一部分。B. 使用B策略就必须要将Undo Log持久化,而且必须要在写Redo Log之前将对应的Undo Log写入磁盘。Undo和Redo Log的这种关联,使得持久化变得复杂起来。为了降低复杂度,InnoDB将Undo Log看作数据,因此记录Undo Log的操作也会记录到redo log中。这样undo log就可以像数据一样缓存起来,而不用再redo log之前写入磁盘了。包含Undo Log操作的Redo Log,看起来是这样的:记录1: <trx1, Undo log insert <undo_insert …>>记录2: <trx1, insert …>记录3: <trx2, Undo log insert <undo_update …>>记录4: <trx2, update …>记录5: <trx3, Undo log insert <undo_delete …>>记录6: <trx3, delete …>C. 到这里,还有一个问题没有弄清楚。既然Redo没有事务性,那岂不是会重新执行被回滚了的事务?确实是这样。同时Innodb也会将事务回滚时的操作也记录到redo log中。回滚操作本质上也是对数据进行修改,因此回滚时对数据的操作也会记录到Redo Log中。一个回滚了的事务的Redo Log,看起来是这样的:记录1: <trx1, Undo log insert <undo_insert …>>记录2: <trx1, insert A…>记录3: <trx1, Undo log insert <undo_update …>>记录4: <trx1, update B…>记录5: <trx1, Undo log insert <undo_delete …>>记录6: <trx1, delete C…>记录7: <trx1, insert C>记录8: <trx1, update B to old value>记录9: <trx1, delete A>一个被回滚了的事务在恢复时的操作就是先redo再undo,因此不会破坏数据的一致性.- InnoDB存储引擎中相关的函数Redo: recv_recovery_from_checkpoint_start()Undo: recv_recovery_rollback_active()Undo Log的Redo Log: trx_undof_page_add_undo_rec_log()

MySQL备份的几种常用

1.mysqldump在日常工作中,我们会使用mysqldump命令创建sql格式的转储文件来备份数据库。或者我们把数据导出后做数据迁移,主备搭建等操作。mysqldump是一个逻辑备份工具,复制原始的数据库对象定义和表数据产生一组可执行的SQL语句。 默认情况下,生成insert语句,也能生成其它分隔符的输出或XML格式的文件。shell> mysqldump [arguments] > file_name我们简单的来看一下日常的用法:备份所有的数据库:shell> mysqldump --all-databases > dump.sql (不包含INFORMATION_SCHEMA,performance_schema,sys,如果想要导出的话还要结合--skip-lock-tables和--database一起用)备份指定的数据库:shell> mysqldump --databases db1 db2 db3 > dump.sql当我们只备份一个数据的时候可以省去 --databases 直接写成:mysqldump test > dump.sql 不过有一些细微的差别,如果不加的话,数据库转储输出不包含创建数据库和use语句,所以可以不加这个参数直接导入到其它名字的数据库里当然我们也可以只备份某个表 :mysqldump --user [username] --password=[password] [database name] [table name] table_name.sql了解了简单的一些用法后我们再着重的看一下几个参数:--master-data 获取备份数据的Binlog位置和Binlog文件名,用于通过备份恢复的实例之间建立复制关系时使用,该参数会默认开启。--dump-slave 用于在slave上dump数据,建立新的slave。因为我们在使用mysqldump时会锁表,所以大多数情况下,我们的导出操作一般会在只读备库上做,为了获取主库的Relay_Master_Log_File和Exec_Master_Log_Pos,需要用到这个参数,不过这个参数只有在5.7以后的才会有–no-data, -d 不导出任何数据,只导出数据库表结构刚刚我们说过在使用mysqldump的时候会锁表,我们来详细的看一下它的锁机制。我们开两个窗口,在第一个里面执行mysqldump -uroot -pxxxxx --master-data=2 --databases dbname > /tmp/dbnamedate +%F.sql然后第二个窗口登陆进去,使用show process的命令可以看到目前dump的session正在执行 1.pngSELECT /*!40001 SQL_NO_CACHE */ * FROM table_name; 可以看到这条sql正在以no_cache的模式查询数据。然后我们在同样的表上执行一下select,发现被阻塞了。光标一直不返回。2.png一般遇到这种文件,我们会想是不是有锁呢?为了验证我们查看一下锁的信息,可以发现dump的进程实际上是加了锁的。3.png我们把具体的general_log打开,然后看一下当时的操作:4.png4101044 Query FLUSH /*!40101 LOCAL */ TABLES4101044 Query FLUSH TABLES WITH READ LOCK (关闭所有打开的表,同时对于所有数据库中的表都加一个读锁,直到显示地执行unlock tables,该操作常常用于数据备份的时候。)4101044 Query SHOW MASTER STATUS(这是因为我用了--master-data=2)所以这个时候表就会被锁住。如果我不加--master-data参数(mysqldump -uroot -pxx --databases db > /tmp/dbnamedate +%F.sql) mysql会显示的对每一张要备份的表执行LOCK TABLES table_name1 READ,LOCK TABLES table_name2 READ并且也不会有读的阻塞。那有没有不锁的方法,其实也是有的,就是使用--single-transaction把备份的操作放在一个事务里去进行带上--single-transaction参数的mysqldump备份过程:如果是5.6版本的mysql

如何从MySQL/InnoDB数据文件中的恢复数据

- 恢复策略前面说到未提交的事务和回滚了的事务也会记录Redo Log,因此在进行恢复时,这些事务要进行特殊的的处理.有2中不同的恢复策略: A. 进行恢复时,只重做已经提交了的事务。B. 进行恢复时,重做所有事务包括未提交的事务和回滚了的事务。然后通过Undo Log回滚那些未提交的事务。- InnoDB存储引擎的恢复机制MySQL数据库InnoDB存储引擎使用了B策略, InnoDB存储引擎中的恢复机制有几个特点: A. 在重做Redo Log时,并不关心事务性。 恢复时,没有BEGIN,也没有COMMIT,ROLLBACK的行为。也不关心每个日志是哪个事务的。尽管事务ID等事务相关的内容会记入Redo Log,这些内容只是被当作要操作的数据的一部分。B. 使用B策略就必须要将Undo Log持久化,而且必须要在写Redo Log之前将对应的Undo Log写入磁盘。Undo和Redo Log的这种关联,使得持久化变得复杂起来。为了降低复杂度,InnoDB将Undo Log看作数据,因此记录Undo Log的操作也会记录到redo log中。这样undo log就可以像数据一样缓存起来,而不用再redo log之前写入磁盘了。包含Undo Log操作的Redo Log,看起来是这样的:记录1: <trx1, Undo log insert <undo_insert …>>记录2: <trx1, insert …>记录3: <trx2, Undo log insert <undo_update …>>记录4: <trx2, update …>记录5: <trx3, Undo log insert <undo_delete …>>记录6: <trx3, delete …>C. 到这里,还有一个问题没有弄清楚。既然Redo没有事务性,那岂不是会重新执行被回滚了的事务?确实是这样。同时Innodb也会将事务回滚时的操作也记录到redo log中。回滚操作本质上也是对数据进行修改,因此回滚时对数据的操作也会记录到Redo Log中。一个回滚了的事务的Redo Log,看起来是这样的:记录1: <trx1, Undo log insert <undo_insert …>>记录2: <trx1, insert A…>记录3: <trx1, Undo log insert <undo_update …>>记录4: <trx1, update B…>记录5: <trx1, Undo log insert <undo_delete …>>记录6: <trx1, delete C…>记录7: <trx1, insert C>记录8: <trx1, update B to old value>记录9: <trx1, delete A>一个被回滚了的事务在恢复时的操作就是先redo再undo,因此不会破坏数据的一致性.- InnoDB存储引擎中相关的函数Redo: recv_recovery_from_checkpoint_start()Undo: recv_recovery_rollback_active()Undo Log的Redo Log: trx_undof_page_add_undo_rec_log()

mysql的redolog文件夹可以删除吗

1.首先在windows服务中将mysql服务删掉,使用命令 sc delete mysql2.在控制面板中卸载掉mysql。3.清理mysql安装目录的ini文件。4.清理注册表:HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesEventlogApplicationMySQL 目录删除HKEY_LOCAL_MACHINESYSTEMControlSet002ServicesEventlogApplicationMySQL 目录删除HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesEventlogApplicationMySQL 目录删除(我卸载的时候没有找到,略过后仍达到完全卸载的目的。)5.有一些mysql的数据文件也必须删除干净,比如说:C:Documents and SettingsAll UsersApplication DataMySQL6.重启电脑。重新安装即可。

mysql如何保证redolog和binlog的一致性,安全性,效率。

* 回复内容中包含的链接未经审核,可能存在风险,暂不予完整展示!mysql如何保证redolog和binlog的一致性,安全性,效率。和数据安转相关的参数sync_binlog:控制binlog的刷新方式(写入到磁盘)innodb_flush_log_at_trx_commit:在innodb下控制着redo的写入方式innodb_support_xa:外部事务,用来保证binlog和redo一致性的,俗称两段式提交binlog_order_commits:按照binlog的写入顺序提交事务,保证redo和binlog的已执行binlog_max_flush_queue_time: leader线程搜集binlog的超时时间2pc提交(官方支持)(redo日志在prepare阶段就已经sync),绝大部分都比较支持这种说法http://dev.m***.com/doc/refman/5.6/en/binary-log.htmlhttp://blog.i***.net/15480802/viewspace-1411356http://www.l******.com/Linux/2015-11/124942.htmhttp://www.2**.com/database/201306/221413.html2pc流程:(sync_binlog = 1,innodb_flush_log_at_trx_commit = 1 )1.prepare阶段:sync redo 日志(未sync的redo存放于innodb_log_buffer_size中),系统自动完成获取prepare_commit_mutex(一个全局锁,一次只能被一个事务获取)2.生成binlog,将binlog写入文件系统(未提交之前binlog存放在binlog_cache_size中),sync binlog,这一步受sync_binlog控制3.提交commit 将commit标志sync ,释放prepare_commit_mutex(这一步应该受innodb_flush_log_at_trx_commit的控制)违背了这个参数的定义:innodb_flush_log_at_trx_commit观点二:redo日志在最后的commit的时候才synchttp://blog.i***.net/28218939/viewspace-19758092pc流程:(官方没有明显的支持这种说法)1.prepare阶段:获取prepare_commit_mutex2.生成binlog,将binlog写入文件系统(未提交之前binlog存放在binlog_cache_size中),sync binlog3.提交commit 将redo log sync ,释放prepare_commit_mutex这种方式会造成binlog的日志记录多余redo日志记录,在恢复的时候是如何恢复? 难道是以binlog为准,不管这个事务的redo有没有提交 ,只要写binlog就认为该事务以提交(现阶段还没有找到有关该说法).innodb数据恢复流程1.查找未提交的redo日志(找xid)2.用xid去binlog查找对应的日志记录3.如果有就认为这个事务是提交的,并补充commit。如果没有就认为是没有提交的,在恢复的时候就rollback事务###################################################################################################以上2pc日志写入方式是在 mysql5.6之前的方式,当sync_binlog=1的时候 系统的性能非常糟糕。从5.6 之后就开始采用BLGC方式写2pc日志,来提升性能BLGC具体流程如下:(每一个阶段只有一个活跃的线程)flush stage:搜集多个线程产生的binlog,依次放入flush队列的末尾,sync stage:flush队列超时(binlog_max_flush_queue_time)或者没有线程产生binlog了 ,flush队列开始sync队列,将binlog写入磁盘(合并io) commit stage:队列进入提交阶段(这里只做提交操作,redo日志的写入已经在prepare写入)个人理解:flush stage:队列中的第一个线程为leader线程,后面的线程为follower线程,leader线程主要负责收集待提交binlog的线程,并且放入flush 队列的末尾,直到没有找到需要提交binog的线程,或者超时(binlog_max_flush_queue_time),才进入sync stagesync stage:如果flush stage队列为空,则之前leader线程依然为leader线程,负责binlog的sync,否则变成follower线程(合并执行sync)commit stage:sync完binlog的线程被放入commit队列的末尾,等待提交5.7 的组提交:Step1. InnoDB Prepare,记录当前的LSN到thd中。Step2. 进入 Group Commit 的flush stage;Leader搜集队列,同时算出队列中最大的LSN。Step3. 将InnoDB的redo log write/fsync到指定的LSN Step4. 写Binlog并进行随后的工作(sync Binlog, InnoDB commit也就是将 redo log的write/sync延迟到了 binlog group commit的 flush stage 之后,sync binlog之前。通过延迟写redo log的方式,显式的为redo log做了一次组写入(redo log group write),并减少了(redo log) log_sys->mutex的竞争。组提交http://www.t*****.com/articles/rEZr2qhttp://m********.com/?p=581http://www.c**.net/article/2015-01-16/2823591(淘宝内部mysql交流)innodb数据丢失的问题:http://www.3****.com/content/14/1019/00/12904276_418041635.shtml组提交的理解:http://www.b****.com/pdb/mysql/201407/226226.html本文出自 “SQLServer MySQL” 博客,请务必保留此出处http://dwchaoyue.blog.5***.com/2826417/1784509mysql如何保证redolog和binlog的一致性,安全性,效率。标签:mysql 原理

postgresql linux 系统英文乱码

设置一下其他环境试试,如果不行的话可以重新安装一下postgresql如果Windows控制台下显示乱码,可使用一下命令解决:chcp 437/* 设置英文环境 */chcp 932/*设置日文环境*/chcp 936/*设置简体中文环境 */chcp 949/*设置韩文环境*/chcp 950/*设置繁体中文环境*/chcp 65001/*设置UTF-8环境*/如果cmd的默认代码页属性修改不了,那么修改注册表:1 win R打开运行,输入regedit打开注册表编辑器。2 找到 [HKEY_CURRENT_USERConsole\%SystemRoot%_system32_cmd.exe]3 修改”CodePage”=dword:000003a8十六进制”000003a8″或十进制”936″,表示“936 (ANSI/OEM – 简体中文 GBK)”。

AT返回HCSQ:"TLE",30,20,21,14什么意思

30 -- lte_rssi 信号强度20 -- lte_rsrp 信号接收功率21 -- lte_sinr 信号与干扰噪声比14 -- lte_rsrq 信号接收指令

DCS系统显示SQ.BQ.F表示仪表什么意思?

对于它那个系统当中就是选定的表示已就什么意思,这个话还真不大多清楚。

LINUX中执行SQLLDR报错

1.?提高linux中默认同时打开的最大文件数量(默认是1024)最便捷的方法是在/etc/profile文件中加入ulimit?-n?最大开启数量但是这种方法无法从根本上查出什么原因导致java打开了这么多的文件2.?java端调查开启文件多的原因?Linux下查看进程打开了哪些文件?lsof?-p??进程id????->??打开的具体文件?lsof?-p??进程id|wc?-l???->??打开文件的数量通过调查发现,java开了很多TYPE为FIFO(Linux中的管道)的文件,因此联想到有可能是java代码中的流没有正常关闭或者释放导致的。而且Java在Linux下执行命令的时候需要用到Process类,这个类在使用后需要destroy()掉,否者也会导致文件数开启的过多

错误类型: Microsoft OLE DB Provider for SQL Server (0x80040E21) 多步 OLE DB 操作产生错误。

错误类型: Microsoft OLE DB Provider for SQL Server (0x80040E21) 多步 OLE DB 操作产生错误。VSP。 1032----------------逍遥社区 。EUT看MM就上非常刺激的

squash和pumpkin的区别

squash是嫩的,pumpkin是老的。

英语歌Days like masquerade的中文歌词

《Masquerade》为当红女饶舌歌手麻辣鸡Nicki Minaj第二张嘻哈流行专辑《Pink Friday: Roman Reloaded》豪华版中的曲目。该曲也作为了2012 adidas<全倾全力>广告背景曲,Nicki Minaj本人也参与了广告的拍摄。歌名:Masquerade演唱:Nicki Minaj词曲:Onika Maraj,Lukasz Gottwald,Benjamin Levin,Henry Walter歌曲时长:3:48所属专辑:《Pink Friday: Roman Reloaded》(Deluxe Edition)发行时间:2012-04-02唱片公司:Cash Money Records音乐风格:Synthpop, dance-pop中英歌词:Feel the beat at the drum随著鼓声的节奏Move like you really wanna be number one你像是要成为头号巨星一样的摇摆You could beat out the comp你可以不随著谱的规则来演奏Run like you really wanna be at the top你就像要成为最颠峰的角色而演出Stop" adrenaline by cause停止,肾上腺素激增是因为You have been identified as a hustler你已经被认定是一个骗子了Topical discussion repeat it like a percussion谣言八卦不停地重复就像停不下来的节奏Chuck the douce up" and tell "em is just love潇洒的道别,并告诉他们:这就是爱阿Damn digged a dug该死的,我真的超爱这样Like "em run state mag cause we living it up就像不断散波的杂志媒体,因为我们正活在当下Shelve tops is on现在杂志已经上架了And I pop it" like i"m popping我上了封面,我懒得再去诠释Like a popping sin call每次都是多说多错And now" I don"t wanna take you而现在,我不想再抓住你If we fall dow如果我们坠落了Don"t get upset" and now it"s just the beginning不要难过,因为这只是个开始而已And we"ll figure it somehow而我们该去想办法盤算一下Right now masquerade" master the mary go round现在开始伪装吧,把一切耍得团团转Right now masquerade" master the mary go round现在开始伪装吧,把一切耍得团团转Right" now" it"s something you created就是现在,你去搞点东西出来It"s never ever too late这永远都不会太晚It"s never ever too late这永远都不会太晚Right now现在Okay to make a mistake好吧,去弄些大问题出来Yeah baby this is your day耶~宝贝,这是属於你的日子It"s time to masquerade是时候开始伪装了Bass bass低音声Feel the bass in ya face感觉重低音袭上你的脸庞Hit the finish line抵达终点线First place in the race在这场比赛得到胜利Yes" king kong on ya chestyes~挺著金刚般的胸膛Running and i"m coming up拍打著迎接我的到来Baton to your left把棒子交接给你Yup" you could be who you want耶~你现在可以变成你想成为的那个样You could be who you is你可以变成你想要的样子Never be who you aren"t不要变成你不想的样子Never ever fall on the pressure永远不要被压力给压垮了Desperate times" get desperate mesure要是没希望了,就破釜沉舟给他一击吧Damn digged a dug该死的,我真的超爱这样Like "em run state mag cause we living it up就像不断散波的杂志媒体,因为我们正活在当下Shelve tops is on现在杂志已经上架了And I pop it" like i"m popping我上了封面,我懒得再去诠释Like a popping sin call每次都是多说多错And now" I don"t wanna take you而现在,我不想再抓住你If we fall dow如果我们坠落了Don"t get upset" and now it"s just the beginning不要难过,因为这只是个开始而已And we"ll figure it somehow而我们该去想办法盤算一下Right now masquerade" master the mary go round现在开始伪装吧,把一切耍得团团转Right now masquerade" master the mary go round现在开始伪装吧,把一切耍得团团转Right" now" it"s something you created就是现在,你去搞点东西出来It"s never ever too late这永远都不会太晚It"s never ever too late这永远都不会太晚Right now现在Okay to make a mistake好吧,去弄些大问题出来Yeah baby this is your day耶~宝贝,这是属於你的日子It"s time to masquerade是时候开始伪装了I"ma call ya afro cause you never bald我或许称你是个黑鬼,因为你从不枯燥F-ck all you bitches and i"ll never call去你的,我可从没讲过Next day" suck my test day第二天,就是我该死的测验日I aint" playing games我可不是玩游戏而已Bit my check mateRing 019" ring 019" ring 019拨打019All my party people let me ya one time我派对上的嘉宾,这次就让我..Right now masquerade" master the mary go round现在开始伪装吧,把一切耍得团团转Right now masquerade" master the mary go round现在开始伪装吧,把一切耍得团团转Right" now" it"s something you created就是现在,你去搞点东西出来It"s never ever too late这永远都不会太晚It"s never ever too late这永远都不会太晚Right now现在Okay to make a mistake好吧,去弄些大问题出来Yeah baby this is your day耶~宝贝,这是属於你的日子It"s time to masquerade是时候开始伪装了Right now

【译文】怎样在R语言中使用SQL命令

(downloader) library(dplyr)library(sqldf)library(data.table)library(ggplot2)library(compare)library(plotrix)主要的错误处理函数tryCatch()我们将使用这个函数来处理下载的数据。由于数据以季度频率发布,每年都会有四个观_值(每年有四条记录)。执行这个函数能自己主动下载数据,但假设某些季度数据从网上无法获取(尚未发布)。该函数会返回一条错误信息表示无法找到数据集。如今让我们下载数据的压缩包并将其解压。try.error = function(url){ try_error = tryCatch(download(url,dest="data.zip"), error=function(e) e) if (!inherits(try_error, "error")){ download(url,dest="data.zip") unzip ("data.zip") } else if (inherits(try_error, "error")){ cat(url,"not found ") } }下载不良事件数据我们能够得到自2004年起的FDA不良事件数据。本文将使用2013年以来发布的数据,我们将检查截至当前时间的最新数据并下载。> Sys.time() 函数会返回当前的日期和时间。> data.table包中的year()函数会从之前返回的当前时间中提取年份信息。我们将下载人口、药物、诊断/指示,结果和反应(不良事件)数据。year_start=2013year_last=year(Sys.time())for (i in year_start:year_last){ j=c(1:4) for (m in j){ url1<-paste0("http://www.nber.org/fda/faers/",i,"/demo",i,"q",m,".csv.zip") url2<-paste0("http://www.nber.org/fda/faers/",i,"/drug",i,"q",m,".csv.zip") url3<-paste0("http://www.nber.org/fda/faers/",i,"/reac",i,"q",m,".csv.zip") url4<-paste0("http://www.nber.org/fda/faers/",i,"/outc",i,"q",m,".csv.zip") url5<-paste0("http://www.nber.org/fda/faers/",i,"/indi",i,"q",m,".csv.zip") try.error(url1) try.error(url2) try.error(url3) try.error(url4) try.error(url5) } }http://www.nber.org/fda/faers/2015/demo2015q4.csv.zip not found...http://www.nber.org/fda/faers/2016/indi2016q4.csv.zip not found依据上面的错误信息。截至成文时间(2016年3月13日)。我们最多能够获得2015年第三季度的不良事件数据。> list.files()函数会字符串向量的形式返回当前工作文件夹下全部文件的名字。> 我会使用正_表_式对各个数据集的类别进行筛选。比方^demo.*.csv表示全部名字以demo开头的csv文件。filenames <- list.files(pattern="^demo.*.csv", full.names=TRUE)cat(‘We have downloaded the following quarterly demography datasets‘)filenames我们已经下载了下列季度人口数据"./demo2012q1.csv" "./demo2012q2.csv" "./demo2012q3.csv" "./demo2012q4.csv" "./demo2013q1.csv" "./demo2013q2.csv" "./demo2013q3.csv" "./demo2013q4.csv" "./demo2014q1.csv" "./demo2014q2.csv" "./demo2014q3.csv" "./demo2014q4.csv" "./demo2015q1.csv" "./demo2015q2.csv" "./demo2015q3.csv"让我们用data.table包中的fread()函数来读入这些数据集,以人口数据为例:demo=lapply(filenames,fread)接着让我们把它们转换数据结构并合并成一个数据框:demo_all=do.call(rbind,lapply(1:length(demo),function(i) select(as.data.frame(demo[i]),primaryid,caseid, age,age_cod,event_dt,sex,reporter_country)))dim(demo_all) 3554979 7 我们看到人口数据有超过350万行观_(记录)。译者注:以下的内容都是反复这个流程。能够略过如今让我们合并全部的药品数据filenames <- list.files(pattern="^drug.*.csv", full.names=TRUE)cat(‘We have downloaded the following quarterly drug datasets: ‘)filenamesdrug=lapply(filenames,fread)cat(‘ ‘)cat(‘Variable names: ‘)names(drug[[1]])drug_all=do.call(rbind,lapply(1:length(drug), function(i) select(as.data.frame(drug[i]),primaryid,caseid, drug_seq,drugname,route)))我们已经下载了下列季度药品数据集"./drug2012q1.csv" "./drug2012q2.csv" "./drug2012q3.csv" "./drug2012q4.csv" "./drug2013q1.csv" "./drug2013q2.csv" "./drug2013q3.csv" "./drug2013q4.csv" "./drug2014q1.csv" "./drug2014q2.csv" "./drug2014q3.csv" "./drug2014q4.csv" "./drug2015q1.csv" "./drug2015q2.csv" "./drug2015q3.csv"每张表中的变量名分别为:"primaryid" "drug_seq" "role_cod" "drugname" "val_vbm" "route" "dose_vbm" "dechal" "rechal" "lot_num" "exp_dt" "exp_dt_num" "nda_num" 合并全部的诊断/指示数据集filenames <- list.files(pattern="^indi.*.csv", full.names=TRUE)cat(‘We have downloaded the following quarterly diagnoses/indications datasets: ‘)filenamesindi=lapply(filenames,fread)cat(‘ ‘)cat(‘Variable names: ‘)names(indi[[15]])indi_all=do.call(rbind,lapply(1:length(indi), function(i) select(as.data.frame(indi[i]),primaryid,caseid, indi_drug_seq,indi_pt)))已经下载的数据集为:"./indi2012q1.csv" "./indi2012q2.csv" "./indi2012q3.csv" "./indi2012q4.csv" "./indi2013q1.csv" "./indi2013q2.csv" "./indi2013q3.csv" "./indi2013q4.csv" "./indi2014q1.csv" "./indi2014q2.csv" "./indi2014q3.csv" "./indi2014q4.csv" "./indi2015q1.csv" "./indi2015q2.csv" "./indi2015q3.csv"变量名为:"primaryid" "caseid" "indi_drug_seq" "indi_pt" 合并病人的结果数据:filenames <- list.files(pattern="^outc.*.csv", full.names=TRUE)cat(‘We have downloaded the following quarterly patient outcome datasets: ‘)filenamesoutc_all=lapply(filenames,fread)cat(‘ ‘)cat(‘Variable names ‘)names(outc_all[[1]])names(outc_all[[4]])colnames(outc_all[[4]])=c("primaryid", "caseid", "outc_cod")outc_all=do.call(rbind,lapply(1:length(outc_all), function(i) select(as.data.frame(outc_all[i]),primaryid,outc_cod)))下载的数据集例如以下:"./outc2012q1.csv" "./outc2012q2.csv" "./outc2012q3.csv" "./outc2012q4.csv" "./outc2013q1.csv" "./outc2013q2.csv" "./outc2013q3.csv" "./outc2013q4.csv" "./outc2014q1.csv" "./outc2014q2.csv" "./outc2014q3.csv" "./outc2014q4.csv" "./outc2015q1.csv" "./outc2015q2.csv" "./outc2015q3.csv" 变量名:"primaryid" "outc_cod" "primaryid" "caseid" "outc_code" 最后来合并反应(不良事件)数据集(译者注:这部分无聊地我要哭了)filenames <- list.files(pattern="^reac.*.csv", full.names=TRUE)cat(‘We have downloaded the following quarterly reaction (adverse event) datasets: ‘)filenamesreac=lapply(filenames,fread)cat(‘ ‘)cat(‘Variable names: ‘)names(reac[[3]])reac_all=do.call(rbind,lapply(1:length(indi), function(i) select(as.data.frame(reac[i]),primaryid,pt)))下载的数据集有:"./reac2012q1.csv" "./reac2012q2.csv" "./reac2012q3.csv" "./reac2012q4.csv" "./reac2013q1.csv" "./reac2013q2.csv" "./reac2013q3.csv" "./reac2013q4.csv" "./reac2014q1.csv" "./reac2014q2.csv" "./reac2014q3.csv" "./reac2014q4.csv" "./reac2015q1.csv" "./reac2015q2.csv" "./reac2015q3.csv"变量名为:"primaryid" "pt" 让我们看看不同的数据类型各有多少行all=as.data.frame(list(Demography=nrow(demo_all),Drug=nrow(drug_all), Indications=nrow(indi_all),Outcomes=nrow(outc_all), Reactions=nrow(reac_all)))row.names(all)=‘Number of rows‘allSQL命令记住sqldf包使用SQLiteCOUNT# SQL版本号sqldf("SELECT COUNT(primaryid)as ‘Number of rows of Demography data‘FROM demo_all;")# R版本号nrow(demo_all)3554979 LIMIT命令(显示前几行)# SQL版本号sqldf("SELECT *FROM demo_all LIMIT 6;")# R版本号head(demo_all,6)R1=head(demo_all,6)SQL1 =sqldf("SELECT *FROM demo_all LIMIT 6;")all.equal(R1,SQL1)TRUE*译者注:这部分代码验证了SQL命令和R代码的等价性,下同。WHERE命令SQL2=sqldf("SELECT * FROM demo_all WHERE sex =‘F‘;")R2 = filter(demo_all, sex=="F")identical(SQL2, R2)TRUESQL3=sqldf("SELECT * FROM demo_all WHERE age BETWEEN 20 AND 25;")R3 = filter(demo_all, age >= 20 & age <= 25)identical(SQL3, R3)TRUEGROUP BY 和 ORDER BY# SQL版本号sqldf("SELECT sex, COUNT(primaryid) as TotalFROM demo_allWHERE sex IN (‘F‘,‘M‘,‘NS‘,‘UNK‘)GROUP BY sexORDER BY Total DESC ;")# R版本号demo_all %>% filter(sex %in%c(‘F‘,‘M‘,‘NS‘,‘UNK‘)) %>% group_by(sex) %>%summarise(Total = n()) %>% arrange(desc(Total))SQL3 = sqldf("SELECT sex, COUNT(primaryid) as TotalFROM demo_allGROUP BY sexORDER BY Total DESC ;")R3 = demo_all%>%group_by(sex) %>% summarise(Total = n())%>%arrange(desc(Total))compare(SQL3,R3, allowAll=TRUE)TRUE dropped attributes利用SQL命令进行数据清洗并绘制3D饼图SQL=sqldf("SELECT sex, COUNT(primaryid) as TotalFROM demo_allWHERE sex IN (‘F‘,‘M‘,‘NS‘,‘UNK‘)GROUP BY sexORDER BY Total DESC ;")SQL$Total=as.numeric(SQL$Totalpie3D(SQL$Total, labels = SQL$sex,explode=0.1,col=rainbow(4), main="Pie Chart of adverse event reports by gender",cex.lab=0.5, cex.axis=0.5, cex.main=1,labelcex=1)输出的图例如以下:Inner Join让我们把药品数据和指数数据基于主id和药品序列内连。首先。我们要检查下变量名,看看怎样合并两个数据集。names(indi_all)names(drug_all) "primaryid" "indi_drug_seq" "indi_pt" "primaryid" "drug_seq" "drugname" "route" names(indi_all)=c("primaryid", "drug_seq", "indi_pt" ) # 使两个数据集变量名一致R4= merge(drug_all,indi_all, by = intersect(names(drug_all), names(indi_all))) # R版本号合并R4=arrange(R3, primaryid,drug_seq,drugname,indi_pt) # R版本号排序SQL4= sqldf("SELECT d.primaryid as primaryid, d.drug_seq as drug_seq, d.drugname as drugname, d.route as route,i.indi_pt as indi_pt FROM drug_all d INNER JOIN indi_all i ON d.primaryid= i.primaryid AND d.drug_seq=i.drug_seq ORDER BY primaryid,drug_seq,drugname, i.indi_pt") # SQL版本号compare(R4,SQL4,allowAll=TRUE)TRUE # 两种方法等价R5 = merge(reac_all,outc_all,by=intersect(names(reac_all), names(outc_all)))SQL5 =reac_outc_new4=sqldf("SELECT r.*, o.outc_cod as outc_cod FROM reac_all r INNER JOIN outc_all o ON r.primaryid=o.primaryid ORDER BY r.primaryid,r.pt,o.outc_cod")compare(R5,SQL5,allowAll = TRUE)TRUE# 绘制不同性别的年龄概率分布密度图ggplot(sqldf(‘SELECT age, sex FROM demo_all WHERE age between 0 AND 100 AND sex IN ("F","M") LIMIT 10000;‘), aes(x=age, fill = sex))+ geom_density(alpha = 0.6)绘制出的图例如以下:绘制不同结果的年龄年龄概率分布密度图(译者注:后面都是结果的可视化,可略过。原作者的耐心真好。。)ggplot(sqldf("SELECT d.age as age, o.outc_cod as outcome FROM demo_all d INNER JOIN outc_all o ON d.primaryid=o.primaryid WHERE d.age BETWEEN 20 AND 100 LIMIT 20000;"),aes(x=age, fill = outcome))+ geom_density(alpha = 0.6)输出例如以下:ggplot(sqldf("SELECT de.sex as sex, dr.route as route FROM demo_all de INNER JOIN drug_all dr ON de.primaryid=dr.primaryid WHERE de.sex IN (‘M‘,‘F‘) AND dr.route IN (‘ORAL‘,‘INTRAVENOUS‘,‘TOPICAL‘) LIMIT 200000;"),aes(x=route, fill = sex))+ geom_bar(a

sql中stddev和variance的详细解释?

12

全文搜索之MySQL与ElasticSearch搜索引擎

MySQL支持全文索引和搜索功能。在MySQL中可以在CHAR、VARCHAR或TEXT列使用FULLTETXT来创建全文索引。 FULLTEXT索引主要用MATCH()...AGAINST语法来实现搜索: MySQL的全文搜索存在以下局限: 通常来说MySQL自带的全文搜索使用起来局限性比较大,性能和功能都不太成熟,主要适用于小项目,大项目还是建议使用elasticsearch来做全文搜索。 ElasticSearch是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据,以下简称ES。 Elasticsearch 在 Apache Lucene 的基础上开发而成,Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件。Elastic Stack 是适用于数据采集、充实、存储、分析和可视化的一组开源工具。 Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据中心,再通过分词控制器去将对应的数据分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。 由于ES是基于RESTfull Web接口的,因此我们直接按照惯例传递JSON参数调用接口即可实现增删改查,并且不需要我们做额外的管理操作就可以直接索引文档,ES已经内置了所有的缺省操作,可以自动帮我们定义类型。 再次执行PUT,会对库中已有的id为1的数据进行覆盖,每修改一次_version字段的版本号就会加1。 默认搜索会返回前10个结果: 返回的几个关键词: 查询字符串搜索,可以像传递URL参数一样传递查询语句。 精确查询: 全文搜索: 以上两种方法都需要考虑数据更改后如何与ES进行同步。

mysql与es查询数据速度原理比较

财务平台亿级数据量毫秒级查询优化之elasticsearch原理解析_wang123459的博客-CSDN博客_elasticsearch 查询优化 mysql底层B-tree 支持矮胖,高胖的时候就很难受,说白了就是数据量多会增加IO操作。 ES底层倒排索引。term index不需要存下所有的term,而仅仅是他们的一些前缀与Term Dictionary的block之间的映射关系,再结合FST(Finite StateTransducers)的压缩技术,可以使term index缓存到内存中 (有点二级索引的感觉)

数据恢复:如何恢复Linux中意外删除的Oracle和MySQL数据库

今天有客户的数据库意外被删除了整个目录中的数据文件,操作系统级别的删除,然而幸运的是这个数据库没有崩溃,仍然处于 open 状态的时候,客户就发现了问题,求助到我们,最终完整地恢复了所有数据文件。 在 Linux 下大致重新演示一下恢复的过程,恢复的步骤与数据库版本没有太大关系,与操作系统的不同会有所不同。 1. 在数据库 open 的时候,直接删除 users 表空间中的数据文件。2. 尝试在 users 表空间中创建表,开始报错。 在告警日志中,同样也可以看到类似信息。3. 检查 dbwr 的进程 PID4. dbwr 会打开所有数据文件的句柄。在 proc 目录中可以查到,目录名是进程 PID,fd 表示文件描述符。注意其中“/app/oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf (deleted)”字样,表示该文件已经被删除,如果是 Solaris 操作系统,ls 命令不会有如此清晰的显示,为了在 Solaris 系统中确认哪个句柄对应哪个文件,则需要使用 lsof 程序。 5. 直接 cp 该句柄文件名回原位置。6. 进行数据文件 recover完成数据文件恢复。 恢复的原理是,在 Linux 操作系统中,如果文件从操作系统级别被rm掉,之前打开该文件的进程仍然持有相应的文件句柄,所指向的文件仍然可以读写,并且该文件的文件描述符可以从 /proc 目录中获得。但是要注意的是,此时如果关闭数据库,则此句柄会消失,那么除了扫描磁盘进行文件恢复之外就没有其它方法了,因此在数据库出现问题的时候,如果不确认情况的复杂程度,千万不要随便关闭数据库。重启数据库往往是没有意义的,甚至是致命的。 当然,客户的操作系统是Solaris,并且客户删除的文件还包括 current online redo log,因此还有其它更复杂的操作,不在这里描述。数据恢复:如何恢复Linux中意外删除的Oracle和MySQL数据库标签:tleimage描述符displaycurrent.com情况mysql数据库height
 首页 上一页  4 5 6 7 8 9 10 11 12 13 14  下一页  尾页