在线
客服

在线客服
尊敬的客户,我们24小时竭诚为您服务 公司总机: 0755-83312037 (32条线)

客服
热线

0755-83312037 (32条线)
7*24小时客服服务热线

?

关注
微信

关注官方微信
TOP

返回
顶部

  • 18

    2020-05
    静态网站制作基础知识(3)

    入门 现在能够单独创建出一个简单的页面,页面可以包含各样文本,并且对其进行排列,使用水平线和换行达到像文章一样的效果。 仅仅只是文本文档而已,没有超链接,图片等,也只有单一-的阅读功能,并且,可能不会适配移动设备。 开始学习一些实用性标签,拥有这些,才能称之为一个网站。 图像标签 链接一张图片到网页上,可以对网页进行一些简要性的说明,或是网站Logo,也可以是某些演示图片,这些都并非是文字可用于描述 的,视觉往往比说的有用。 那么如何链接一-张图片呢? 采用图像标签即可,其用法很简单,常用属性只有五个,我建议全部进行使用,因为可以很好的约束图片, 并且也遵守规范。 为什么要在标签内定义宽高而不是使用CSS呢? 原因是,这关于浏览器的渲染机制,如果定义在标签内,将得到更好的速度,因为浏览器的渲染顺序如下: 标签内的属性--> CSS样式-->图片原有大小。 <img src="图像地址" alt= "替代文本" title="鼠标悬浮提示文本" width= "图片宽度" hight="图片高度" /> 注意:在XHTML中,图像标签(img) 必须被正确的结束,在HTML中,它是一个单标签,无需结束。 XHTML示例: <img属性="值" ...</..> 如果你不想使用五个属性,可以根据需要进行删减,但必要的两个属性: src、 alt不能被删除。 进行实践。 注:图像地址可以是本机的绝对路径或是相对路径,例如: D:/图片.png,当然根据规范,图片的命名建议使用英文。 图片宽度或是高度采用的单位最好为像素,示例: width= " 500px" height= "500px" 同样,图像地址可引|用网络中的图片,例如: https://ss3.bdstatic.com/70cFv8Sh_ Q1 YnxGkpoWK1HF6hhy/it/u= 3615363367 ,3948742828&fm=27&gp=0.jpg W3CSchool参考: http://www.w3school.com.cn/tags/tag_ img.asp 超链接标签 超链接指的是,当鼠标单击该标签时,会跳转到指定的界面,或是跳转到某个锚点(具体参照HTML总结“锚链接(未写)“)。 超链接标签也称之为a标签,它常用属性只有两种: href (被链接处)、target (目标窗口) <a href= "被链接的文档或是文件" target="目标窗口" >文本或图像</a> 其中,target属性值如下: _blank :浏览器总在新打开、未命名的窗C ]载入目标文档 _self :默认值,除非与<base>标签中的target属性一起进行使用, 否则笔无意义。 _parent: 此目标使文档载入父框架而非在当前窗口载入新的文档 _top :在窗口主体中载入被链接文档 franename:在指定框架载入目标文档 其余标签的使用后续将会不断完善。 在此之前,可以到此文永久更新地址进行查看: https://docs.q.com/doc/BpDiY30AEVnV2E5MEE4Eg8jQ0hi4zgOUUtYT1

    Read more +
  • 18

    2020-05
    静态网站制作基础知识(2)

    主体:主要的展示平台 <body>标签的作用正是展示信息的平台。 各式各样的标签都能在其中大放异彩,标题标签,段落标签,图片标签,标签..... 每一个标签都需要成对出现,当然也有意外,因为它们天生如此。在后面介绍。 在此之前,我们先学习如何给文档进行注释,以此,我们在以后看到这些代码的时候,也能够知道当时我们的想法是怎样的。 注释标签 <!--注释内容--> 浏览器不会解析注释内容,因为对浏览器没有用处,相反,注释能给带给开发者帮助。 下面开始介绍各式标签,所有的网页都基于此搭建而成,一个完整的网站会存在样式表,它们能够美化网站,当然,样式表会在以后介 绍。 标题标签 <h1>-级标题</h1> 共六级,数值越大则标题大小越小,-个网页标准的做法是只出现-次- -级标签 ,它们是整个网页所需展示的重要摘要。 此标签不多做介绍,进行尝试,于<body>标签内。而非网页的头部标题,是不-样的。 段落标签 <p>总结起初写于2017年9月12号,是学习的经验,知识分享,当然其中也不乏有错,希望看这篇文章的道友能够多多指点,修改错误 的内容。</p> 段落标签用于载入一段文字,或是一篇文章, <p>标签会在前后创建一些空白以突出内容, 可以使用样式表美化它,当然,几乎所有的 标签都可以使用样式表进行美化。 值得注意的是,在源代码中,如果有换行符,浏览器会采用空格来替代它们,因此需要换行的话,需要在源代码的文章进行更改,采用 换行标签来替代源代码中的换行。 进行尝试,于<body>标签内。 字体样式标签 在前面我们学习了两种标签,分别是标题标签和段落标签,如果你没看到,可以看看之前的介绍以及内容。 字体样式标签可以对字体产生影响,从而达到突出字体,让其更为明显,可以很直观的看到。 主要的,且使用次数较多的样式标签如下: <em> <strong> <dfn> <code> <samp> <kbd> <cite> 实际上,这些标签都用于区分内容,以达到显要的,强调开发者所要表达的事物,比如某些关键字,引用的文章内容,或是重要的信 息。 作为简短的介绍,我在知名HTML教学网站上看到了这些标签的简介,因此,在此不多做标签介绍。 以上字体样式标签的简介网址: http://www.w3school.com.cn/tags/tag_ phrase_ elements.asp 特殊符号 有些符号作为HTML的语法符号,在网页实际中并不可见,因此,只能使用特定的转义符来显示它们。 在这里,我将写一-些常用的转 义符以达到读者可以理解其作用。 空格(&nbsp;) 大于号(&gt;) 小号(&lt;) 引号(&quot;) 版权符号(&copy;) 网页支持的转义符网址: http://www.w3school.com.cn/tags/html_ ref_ symbols.html 换行与水平线标签 一个标签可以使用样式表进行美化与设置,有时候当没有引用样式表的时候,可以使用这些实用性标签进行美化,这里就先介绍换行与 水平线标签。 你发现了没有呢?标题标签单独占用了一行,而有些标签则一个紧挨着一个。 实,标签分为两类,分别为:块级标签和行内标签(在CSS中,称之为块级元素以及行内元素)。 块级标签对于目前我们所学习的这些,并没有能力改变它.们.... .但我们能够改变行内标签。 <br />标签,该标签可以使行内标签进行换行,如果在行内标签前后各输入此标签,则该行内标签将成为伪块级标签,在用户看来,它 单独的占据了一行。 换行标签仅仅只是简单的开始新的一行,因此此标签是一个空标签, 并无需成对出现。 有时候我们需要区分上下文内容,但若使用换行标签会显得有些突出,过于猛烈了。因此,可以使用分隔线来区分它们。 <hr />标签,该标签可以在上下文中,产生一条水平线,以此来分隔、区分内容,例如标题和文章内容。其含义实际上是单词的缩写: 水平分隔线(horizontal rule) ; 实践 现在你掌握的知识其实已经能给制作一-些很简单的网页,且拥有可浏览性。 开始进行实践,来制作你的第二个网页。 网页源码: 实际上也可以在<p>标签内嵌套换行标签达到换行的目的,但也可以在在所需换行的时候,创建一个新的<p> 标签以展示内容。 第二个实践项目很简单吧?其实,前端并非我们所想象的那样复杂,只是我们在灌输式教育前丢失了小时的创意....

    Read more +
  • 18

    2020-05
    静态网站制作基础知识(1)

    工具 不建议新手使用任何自动完成功能的编辑器作为新初使用,因为最终你会产生依赖性,离开工具就无法创作出所需要的网页效果了。 我在百度云盘分享了一款工具,针对于新手使用的,代码高亮显示 工欲善其事,必先利其器,先下载你的工具来开始验证在此文章所讨论的知识点以及部分总结。 链接: https://pan.baidu.com/s/ 1dFMWP5v密码: xbad 其实,工具只是帮助我们达到目的而已,你也可以使用记事本进行开发。 实用的学习参考网站在某种意义上来说,其实也算是一种工具。 W3CSchool : http://www.w3school.com.cn/index.html 这篇文章有很多资源将引|用W3CSchool的教程,并且该网站的学习资源也很优秀。 开始 你已经下载工具了吗? 那么开始吧。 HTML是互联网组成的必不可少的一种标记性语言,我们所浏览的网页大都基 于HTML所提供。任何人都可以学习HTML技术,这其实属 于前端的技术范畴。 HTML称为超文本标记语言,具体可以 上网进行搜索。 打开工具,或者在桌面上新建一个文件, 将其命名为index.html * .html其后辍名指的是HTML文件,可以使用任何浏览器打开此文件,这些浏览器会发挥文件的最大作用,而不是简简单单的文本文 档。 那么,如何编写HTML文件呢? 打开任一网站,点按键盘上的F12键,就可以看到其网站的源代码,观看代码并学习其实也是成长的一部分。 HTML5主要分为三部分(包括XHTML) 声明部分、头部(head)、主体 (body),其中,容器(html) 包裹着头部和主体。 XHTML有些版本区分大小写,并且XHTML可能会在未来的某一个时候被HTML 5所替代,所以本文章主要精力放在HTML 5的知识点上。 实践: 我们来逐步分析_上面的实践代码。 此行是网页声明,用于告诉浏览器该如何解析此文档时所使用的HTML或XHTML规范,通常HTML 5的声明格式一 般如此。而XHTML 的声明格式很繁杂,它有三种声明格式,我只写松散(Loose) 声明,其余使用搜索引擎进行完善。 transitional.dtd " > 其余部分在之前已经讲过,但head标签之内的那些是什么呢? 标签用于描述网页的摘要信息,包括文档内容类型,编码信息,搜索关键字,网站功能等,采用键值对的方式描述信息。 这行代码指示浏览器该以怎样的编码来解析文档,有时候出现中文乱码是因为解析文档所用的格式错误 了。 我们来逐步分析上面的实践代码。 此行是网页声明,用于告诉浏览器该如何解析此文档时所使用的HTML或XHTML规范,通常HTML 5的声明格式一 般如此。而XHTML的声明格式很繁杂,它有三种声明格式,我只写松散(Loose) 声明,其余使用搜索弓|擎进行完善。 transitional.dtd " > 其余部分在之前已经讲过,但head标签之内的那些是什么呢? 标签用于描述网页的摘要信息,包括文档内容类型,编码信息,搜索关键字,网站功能等,采用键值对的方式描述信息。 这行代码指示浏览器该以怎样的编码来解析文档,有时候出现中文乱码是因为解析文档所用的格式错误 了。 此标签具体参阅: 百度百科: https://baike.baidu.com/item/meta/4265710?fr= aladdin W3CSCHOOL: http://www.w3school.com.cn/tags/tag_ meta.asp 标签定义文档的标题,浏览器会以特殊的方式展示它,将其置于标签页上,收藏夹,书签等。<br /> <div><br /> </div>主体:主要的展示平台<br /> <body>标签的作用正是展示信息的平台。<br /> 各式各样的标签都能在其中大放异彩,标题标签,段落标签,图片标签,子标签.....<br /> 每一个标签都需要成对出现,当然也有意外,因为它们天生如此。在后面介绍。<br /> 在此之前,我们先学习如何给文档进行注释,以此,我们在以后看到这些代码的时候,也能够知道当时我们的想法是怎样的。<br /> 注释标签<br /> <!--注释内容--><br /> 浏览器不会解析注释内容,因为对浏览器没有用处,相反,注释能给带给开发者帮助。<br /> <p>下面开始介绍各式标签,所有的网页都基于此措建而成,-个完整的网站会存在样式表,它们能够美化网站,当然,样式表会在以后介绍。</p><p>标题标签<br /> <h1>-级标题</h1><br /> 共六级,数值越大则标题大小越小,-个网页标准的做法是只出现-次- -级标签 ,它们是整个网页所需展示的重要摘要。<br /> 此标签不多做介绍,进行尝试,于<body>标签内。而非网页的头部标题,不-样的。<br /> 段落标签<br /> <p>总结起初写于2017年9月12号,是学习的经验,知识分享,当然其中也不乏有错,希望看这篇文章的道友能够多多指点,修改错误<br /> 的内容。</p><br /> 段落标签用于载入一-段文字,或是一_篇文章,<p>标签会在前后创建一些空白以突出内容, 可以使用样式表美化它,当然,几乎所有的<br /> 标签都可以使用样式表进行美化。<br /> 值得注意的是,在源代码中,如果有换行符,浏览器会采用空格来替代它们,因此需要换行的话,需要在源代码的文章进行更改,采用<br /> 换行标签来替代源代码中的换行。<br /> 进行尝试,于<body>标签内。<br /> <div><br /> </div>字体样式标签<br /> 在前面我们学习了两种标签,分别是标题标签和段落标签,如果你没看到,可以看看之前的介绍以及内容。<br /> 字体样式标签可以对字体产生影响,从而达到突出字体,让其更为明显,可以很直观的看到。<br /> 主要的,且使用次数较多的样式标签如下:<br /> <em> <strong> <dfn> <code> <samp> <kbd> <cite><br /> 实际上,这些标签都用于区分内容,以达到显要的,强调开发者所要表达的事物,比如某些关键字,引用的文章内容,或是重要的信<br /> 息。<br /> 作为简短的介绍,我在知名HTML教学网站上看到了这些标签的简介,因此,在此不多做标签介绍。<br /> 以上字体样式标签的简介网址: http://www.w3school.com.cn/tags/tag_ phrase_ elements.asp<br /> <div><br /> </div>换行与水平线标签<br /> 一个标签可以使用样式表进行美化与设置,有时候当没有引用样式表的时候,可以使用这些实用性标签进行美化,这里就先介绍换行与<br /> 水平线标签。<br /> 你发现了没有呢?标题标签单独占用了一行,而有些标签则一个紧挨着一个。<br /> 其实,标签分为两类,分别为:块级标签和行内标签(在CSS中, 称之为块级元素以及行内元素)。<br /> 块级标签对于目前我们所学习的这些,并没有能力改变.们....但我们能够改变行内标签。<br /> <br />标签,该标签可以使行内标签进行换行,如果在行内标签前后各输入此标签,则该行内标签将成为伪块级标签,在用户看来,它<br /> 单独的占据了一行。<br /> 换行标签仅仅只是简单的开始新的一行,因此此标签是一个空标签, 并无需成对出现。<br /> 有时候我们需要区分上下文内容,但若使用换行标签会显得有些突出,过于猛烈了。因此,可以使用分隔线来区分它们。<br /> <hr />标签,该标签可以在上下文中,产生一条水平线, 以此来分隔、区分内容,例如标题和文章内容。其含义实际上是单词的缩写:<br /> 水平分隔线(horizontal rule) ;<br /> <div><br /> </div></p></p>

    Read more +
  • 11

    2020-05
    MySQL 同步复制及高可用方案总结

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">1.前言mysql作为应用程序的数据存储服务,要实现mysql数据库的高可用。必然要使用的技术就是数据库的复制,如果主节点出现故障可以手动的切换应用到从节点,这点相信运维同学都是知道,并且可以实现的。但是这种情况只是手动的切换,对可用性有要求的业务需要分别实现主</font> </td> </tr></tbody></table> 1.前言 mysql作为应用程序的数据存储服务,要实现mysql数据库的高可用。必然要使用的技术就是数据库的复制,如果主节点出现故障可以手动的切换应用到从节点,这点相信运维同学都是知道,并且可以实现的。但是这种情况只是手动的切换,对可用性有要求的业务需要分别实现主库和从库的高可用,保障在数据库出现down机的情况下,可以自动实现数据库的故障转移,保障应用的可用性和用户体验。 本文将会对一些常用的数据库高可用方案进行介绍,根据你不同的场景,选择合适的高可用方案即可。 2.MMM高可用方案 2.1.Mysql-MMM介绍 MMM(Master-Master replication managerfor Mysql,Mysql主主复制管理器)是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理mysql Master-Master复制的配置(同一时间只有一个节点是可写的)。 2.2.组件 mmm_mond:监控进程,负责所有的监控工作,决定和处理所有节点角色活动。此脚本需要在监管机上运行。 mmm_agentd:运行在每个mysql服务器上的代理进程,完成监控的探针工作和执行简单的远端服务设置。此脚本需要在被监管机上运行。 mmm_control:一个简单的脚本,提供管理mmm_mond进程的命令。 mysql-mmm的监管端会提供多个虚拟IP(VIP),包括一个可写VIP,多个可读VIP,通过监管的管理,这些IP会绑定在可用mysql之上,当某一台mysql宕机时,监管会将VIP迁移至其他mysql。 在整个监管过程中,需要在mysql中添加相关授权用户,以便让mysql可以支持监理机的维护。授权的用户包括一个mmm_monitor用户和一个mmm_agent用户,如果想使用mmm的备份工具则还要添加一个mmm_tools用户。 2.3.架构图 正常工作时: 主节点故障时: 微信图片_20191015154036.png 2.4.MMM优点 (1)高可用性,扩展性好,出现故障自动转移,对于主主同步,在同一时间只提供一台数据库写操作,保证数据的一致性。 (2)配置简单,容易操作。 2.5.MMM缺点 (1)需要一台备份服务器,浪费资源 (2)需要多个虚拟IP (3)agent可能意外终止,引起裂脑。 3.MHA介绍 MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。 3.1.MHA架构介绍 该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。 在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失(配合mysql半同步复制效果更佳),但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。 注意:目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,因为至少需要三台服务器,出于机器成本的考虑,淘宝也在该基础上进行了改造,目前淘宝TMHA已经支持一主一从。 3.2.MHA架构图 正常工作时架构图: 微信图片_20191015154220.png 主库down机时架构: 微信图片_20191015154249.png 3.3.故障转移过程 (1)从宕机崩溃的master保存二进制日志事件(binlog events); (2)识别含有最新更新的slave; (3)应用差异的中继日志(relay log)到其他的slave; (4)应用从master保存的二进制日志事件(binlog events); (5)提升一个slave为新的master; (6)使其他的slave连接新的master进行复制; (7)在新的master启动vip地址,保证前端请求可以发送到新的master。 3.4.MHA优点 (1)不需要备份服务器 (2)不改变现有环境 (3)操作非常简单 (4)可以进行日志的差异修复 (5)可以将任意slave提升为master 3.5.MHA缺点 (1)需要全部节点做ssh秘钥 (2)MHA出现故障后配置文件会被修改,如果再次故障转移需要重新修改配置文件。 (3)自带的脚本还需要进一步补充完善,且用perl开发,二次开发困难。 4.DRBD+(heartbeat,corosync) 4.1.方案简介 本方案采用Heartbeat或者corosync双机热备软件来保证数据库的高稳定性和连续性,数据的一致性由DRBD这个工具来保证(如果可以尽量放到分布式存储上面)。默认情况下只有一台mysql在工作,当主mysql服务器出现问题后,系统将自动切换到备机上继续提供服务,当主数据库修复完毕,又将服务切回继续由主mysql提供服务。 4.2.组件 Heartbeat,corosync作为心跳检测机制,监控primary节点的状态。当主节点宕掉之后,迅速提升secondary节点为新的主节点,并切换IP; drbd负责数据同步 4.3.架构图 微信图片_20191015154253.jpg 4.4.数据同步过程 mysql进行刷盘时,会通过不同的sync方式,最终将数据写入disk; drbd收到刷盘成功的信息后,将对应的磁盘块位置,和变更动作,通过网络传递至secondary节点; secondary的drbd接收到变更信息后,将这些信息落盘; 4.5.切换过程 前提:secondary节点的mysql服务不启动; heartbeat检测到primary的mysql服务停止,则摘掉IP、umount掉数据盘、将primary切换为secondary; 在原来的secondary上,提升drbd同步为primary,挂载数据盘,启动mysql服务、绑定IP; 从库跟着IP和端口自动进行迁移; 4.6.方案优点 (1)历史悠久、安全性高、稳定性高、可用性高、出现故障自动切换。 (2)数据一致性强 4.7.方案缺点 (1)需要一台备份服务器,浪费资源 (2)不方便扩展 (3)无论drbd还是headbetart,corosync都可能发生裂脑 5.Mysql route介绍 5.1.什么是mysql route MySQL Router是处于应用client和dbserver之间的轻量级代理程序,它能检测,分析和转发查询到后端数据库实例,并把结果返回给client。是mysql-proxy的一个替代品。其架构图和功能如下。 微信图片_20191015154257.png (1)Router实现读写分离,程序不是直接连接数据库IP,而是固定连接到mysql router。MySQL Router对前端应用是透明的。应用程序把MySQL Router当作是普通的mysql实例,把查询发给MySQL Router,而MySQL Router会把查询结果返回给前端的应用程序。 (2)从数据库服务器故障,业务可以正常运行。由MySQL Router来进行自动下线不可用服务器。程序配置不需要任何修改。 (3)主数据库故障,由MySQL Router来决定主从自动切换,业务可以正常访问。程序配置不需要做任何修改。 5.2.读写分离原理 MySQL Router接受前端应用程序请求后,根据不同的端口来区分读写,把连接读写端口的所有查询发往主库,把连接只读端口的select查询以轮询方式发往多个从库,从而实现读写分离的目的。读写返回的结果会交给MySQL Router,由MySQL Router返回给客户端的应用程序。 5.3.Mysql router用途 MySQL Router的主要用途是读写分离,主主故障自动切换,负载均衡,连接池等。 5.4.Mysql router主主故障自动切换的坑 Mysql router主主故障切换功能经过测试没有问题,但是有一个比较大的坑需要注意,主库发生切换之后,从库的连接的master服务器地址不会发生改变,需要自己写脚本进行判断。 5.5.优点 (1)基于DAL层实现mysql的高可用。 (2)可以同时实现主主故障切换和读写分离。 (3)插件式架构允许用户进行额外的功能扩展。 5.6.缺点 (1)高可用功能需要进一步完善:存在主库切换之后,从库不会自动切换主库地址的坑。 (2)读写情况使用不同端口,需要修改应用程序。 6.mysql Cluster 国内用的非常少,主要因为一下三点: (1)需要更改存储引擎 (2)付费 (3)国内几乎没有使用案例 优点: 高可用,可用率达99.999% 6.1.结束语 上面的高可用方案,只是我自己比较熟悉的,而且也是应用比较多的。mysql毕竟发展了有20多年了,各种高可用方案还是很多的,其他的高可用方案各位钥匙有兴趣,可以自己研究。 版权申明:作者:西门飞冰,一名90后it男,一直在北京工作,热爱运动,热爱冒险,热爱旅行。由作者原创投稿,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意,谢谢。 关注 民工哥技术之路 微信公众号对话框回复关键字:1024 可以获取一份最新整理的技术干货:包括系统运维、数据库、redis、MogoDB、电子书、Java基础课程、Java实战项目、架构师综合教程、架构师实战项目、大数据、Docker容器、ELK Stack、机器学习、BAT面试精讲视频等。

    Read more +
  • 11

    2020-05
    MySQL数据库基础篇之入门基础命令

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">在日常工作与学习中,无论是开发、运维、还是测试,对于数据库的学习是不可避免的,同时也是日常工作的必备技术之一。在互联网公司,开源产品线比较多,互联网企业所用的数据库占比较重的还是MySQL。在刚刚出炉的 2019 年3月份数据库流行度排行榜上,第一梯队的前三个数</font> </td> </tr></tbody></table> 在日常工作与学习中,无论是开发、运维、还是测试,对于<a href="http://www.webjx.com/database/"><u>数据库</u></a>的学习是不可避免的,同时也是日常工作的必备技术之一。在互联网公司,开源产品线比较多,互联网企业所用的<a href="http://www.webjx.com/database/"><u>数据库</u></a>占比较重的还是MySQL。 在刚刚出炉的 2019 年3月份<a href="http://www.webjx.com/database/"><u>数据库</u></a>流行度排行榜上,第一梯队的前三个<a href="http://www.webjx.com/database/"><u>数据库</u></a>产品都获得了显著的加分增长。 其中 Oracle 上升了15.12分,MySQL上升了30.96分,SQL Server则上升了 7.79分。以下是前20位的<a href="http://www.webjx.com/database/"><u>数据库</u></a>榜单: 所以,民工哥,将公众号所推送的MySQL<a href="http://www.webjx.com/database/"><u>数据库</u></a>的文章,统一整理做成一个学习进阶的集合,在此分享给各位读者。各位读者朋友觉得文章对你在学习MySQL<a href="http://www.webjx.com/database/"><u>数据库</u></a>的路上有所帮助,请动动小手转发分享出去。让更多的小伙伴们一起参与学习,大家共同成长,一起奔跑在技术的路上。 有需要加入民工哥组建的技术交流群的读者朋友们,可在公众号后台回复:「加群」 数据――公司的生命线,因此在大多数的互联网公司,都在使用开源的<a href="http://www.webjx.com/database/"><u>数据库</u></a>产品,MySQL也因此关注度与使用率非常的高,所以做为运维的

    Read more +
  • 11

    2020-05
    MySQL数据库入门多实例配置

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">前面介绍了相关的基础命令操作:MySQL数据库基础篇之入门基础命令所有的操作都是基于单实例的,mysql多实例在实际生产环境也是非常实用的,因为必须要掌握。1、什么是多实例多实例就是一台服务器上开启多个不同的服务端口(默认3306),运行多个mysql的服务进程,这此服</font> </td> </tr></tbody></table> 前面介绍了相关的基础命令操作:MySQL<a href="http://www.webjx.com/database/"><u>数据库</u></a>基础篇之入门基础命令 所有的操作都是基于单实例的,mysql多实例在实际生产环境也是非常实用的,因为必须要掌握。 1、什么是多实例 多实例就是一台服务器上开启多个不同的服务端口(默认3306),运行多个mysql的服务进程,这此服务进程通过不同的socket监听不同的服务端口来提供各在的服务,所有实例之间共同使用一套MYSQL的安装程序,但各自使用不同的配置文件、启动程序、数据文件,在逻辑上是相对独立的。 多实例主要作用是:充分利用现有的服务器硬件资源,为不同的服务提供数据服务,但是如果某个实例并发比较高的,同样是会影响到其它实例的性能 2、安装多实例环境准备 安装前需要先安装mysql,但是只需将安装过程进行到make install即可(编译安装),如果使用免安装程序,只需解压软件包即可,今天的环境是通过免安装包来安装mysql主程序(其它的安装可以参考前面的安装过程自行测试) 系统环境 [root@centos6 ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@centos6 ~]# uname -r 2.6.32-431.el6.x86_64 安装程序 mysql-5.5.52-linux2.6-x86_64.tar.gz 首先将软件下载到本地 wget http://mirrors.sohu.com/mysql/MySQL-5.5/mysql-5.5.52-linux2.6-x86_64.tar.gz 创建安装用户 [root@centos6 ~]#groupadd mysql [root@centos6 ~]#useradd mysql -s /sbin/nologin -g mysql -M [root@centos6 ~]#tail -1 /etc/passwd mysql:x:500:500::/home/mysql:/sbin/nologin 创建多实例的数据目录 [root@centos6 tools]# mkdir -p /data/{3306,3307} [root@centos6 tools]# tree /data/ /data/ +-- 3306 +-- 3307 2 directories, 0 files 3、安装MYSQL多实例 接下来进行安装mysql的多实例操作 解压软件 [root@centos6 tools]# ll mysql-5.5.52-linux2.6-x86_64.tar.gz -rw-r--r--. 1 root root 185855000 Aug 26 21:38 mysql-5.5.52-linux2.6-x86_64.tar.gz [root@centos6 tools]# tar zxf mysql-5.5.52-linux2.6-x86_64.tar.gz 拷贝配置文件 [root@centos6 mysql-5.5.52-linux2.6-x86_64]# cp support-files/my-small.cnf /data/3306/my.cnf [root@centos6 mysql-5.5.52-linux2.6-x86_64]# cp support-files/mysql.server /data/3306/mysql [root@centos6 mysql-5.5.52-linux2.6-x86_64]# cp support-files/my-small.cnf /data/3307/my.cnf [root@centos6 mysql-5.5.52-linux2.6-x86_64]# cp support-files/mysql.server /data/3307/mysql 为一规范安装路径,将免安装包拷贝到应用程序目录下 [root@centos6 tools]# mv mysql-5.5.52-linux2.6-x86_64 /application/mysql [root@centos6 tools]# ll /application/mysql total 72 drwxr-xr-x. 2 root root 4096 Dec 9 17:15 bin -rw-r--r--. 1 7161 31415 17987 Aug 26 19:24 COPYING drwxr-xr-x. 3 root root 4096 Dec 9 17:15 data drwxr-xr-x. 2 root root 4096 Dec 9 17:15 docs drwxr-xr-x. 3 root root 4096 Dec 9 17:15 include -rw-r--r--. 1 7161 31415 301 Aug 26 19:24 INSTALL-BINARY drwxr-xr-x. 3 root root 4096 Dec 9 17:15 lib drwxr-xr-x. 4 root root 4096 Dec 9 17:15 man drwxr-xr-x. 10 root root 4096 Dec 9 17:15 mysql-test -rw-r--r--. 1 7161 31415 2496 Aug 26 19:24 README drwxr-xr-x. 2 root root 4096 Dec 9 17:15 scripts drwxr-xr-x. 27 root root 4096 Dec 9 17:15 share drwxr-xr-x. 4 root root 4096 Dec 9 17:15 sql-bench drwxr-xr-x. 2 root root 4096 Dec 9 17:15 support-files 修改配置文件与启动文件 因为是多实例,其中参数需要修改,修改后的配置文件如下:配置文件my.cnf [client] port = 3307 socket = /data/3307/mysql.sock [mysql] no-auto-rehash [mysqld] user = mysql port = 3307 socket = /data/3307/mysql.sock basedir = /application/mysql datadir = /data/3307/data #log_long_format #log-error = /data/3307/error.log #log-slow-queries = /data/3307/slow.log pid-file = /data/3307/mysql.pid server-id = 3 [mysqld_safe] log-error=/data/3307/mysql3307.err pid-file=/data/3307/mysqld.pid 启动程序文件mysql [root@backup 3307]# cat mysql #!/bin/sh init port=3307 mysql_user="root" mysql_pwd="migongge" CmdPath="/application/mysql/bin" mysql_sock="/data/${port}/mysql.sock" #startup function_start_mysql() { if [ ! -e "$mysql_sock" ];then printf "Starting MySQL...\n" /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2&gt;&amp;1 &gt; /dev/null &amp; else printf "MySQL is running...\n" exit fi } #stop function function_stop_mysql() { if [ ! -e "$mysql_sock" ];then printf "MySQL is stopped...\n" exit else printf "Stoping MySQL...\n" ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown fi } #restart function function_restart_mysql() { printf "Restarting MySQL...\n" function_stop_mysql sleep 2 function_start_mysql } case $1 in start) function_start_mysql ;; stop) function_stop_mysql ;; restart) function_restart_mysql ;; *) printf "Usage: /data/${port}/mysql {start|stop|restart}\n" esac 其它的配置可参考配置文件进行修改即可 多实例初始化操作 [root@centos6 3306]# /application/mysql/scripts/mysql_install_db --basedir=/application/mysql --datadir=/data/3306/data --user=mysql Installing MySQL system tables... 161209 18:02:17 [Warning] 'THREAD_CONCURRENCY' is deprecated and will be removed in a future release. 161209 18:02:17 [Note] /application/mysql/bin/mysqld (mysqld 5.5.52-log) starting as process 3336 ... OK Filling help tables... 161209 18:02:17 [Warning] 'THREAD_CONCURRENCY' is deprecated and will be removed in a future release. 161209 18:02:17 [Note] /application/mysql/bin/mysqld (mysqld 5.5.52-log) starting as process 3343 ... OK To start mysqld at boot time you have to copy support-files/mysql.server to the right place for your system PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! To do so, start the server, then issue the following commands: /application/mysql/bin/mysqladmin -u root password 'new-password' /application/mysql/bin/mysqladmin -u root -h centos6 password 'new-password' Alternatively you can run: /application/mysql/bin/mysql_secure_installation which will also give you the option of removing the test databases and anonymous user created by default. This is strongly recommended for production servers. See the manual for more instructions. You can start the MySQL daemon with: cd /application/mysql ; /application/mysql/bin/mysqld_safe &amp; You can test the MySQL daemon with mysql-test-run.pl cd /application/mysql/mysql-test ; perl mysql-test-run.pl Please report any problems at http://bugs.mysql.com/ 初始化成功后,会在数据目录下产生一个数据目录data和一些文件 [root@centos6 3306]# ll /data/3306/data/ total 1136 drwx------. 2 mysql root 4096 Dec 9 18:02 mysql -rw-rw----. 1 mysql mysql 27693 Dec 9 18:02 mysql-bin.000001 -rw-rw----. 1 mysql mysql 1114546 Dec 9 18:02 mysql-bin.000002 -rw-rw----. 1 mysql mysql 38 Dec 9 18:02 mysql-bin.index drwx------. 2 mysql mysql 4096 Dec 9 18:02 performance_schema drwx------. 2 mysql root 4096 Dec 9 18:02 test 另一个实例的初始化请参考上述操作进行,操作过程不再一一介绍 [root@centos6 3307]# ll /data/3307/data/ total 1136 drwx------. 2 mysql root 4096 Dec 9 18:40 mysql -rw-rw----. 1 mysql mysql 27693 Dec 9 18:40 mysql-bin.000001 -rw-rw----. 1 mysql mysql 1114546 Dec 9 18:40 mysql-bin.000002 -rw-rw----. 1 mysql mysql 38 Dec 9 18:40 mysql-bin.index drwx------. 2 mysql mysql 4096 Dec 9 18:40 performance_schema drwx------. 2 mysql root 4096 Dec 9 18:40 test 4 、启动多实例并登录 启动服务 [root@backup 3307]# /data/3306/mysql start Starting MySQL... [root@backup 3307]# lsof -i :3306 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 19986 mysql 10u IPv4 90967 0t0 TCP *:mysql (LISTEN) [root@backup 3307]# /data/3307/mysql start Starting MySQL... [root@backup 3307]# lsof -i :3307 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 21648 mysql 11u IPv4 92899 0t0 TCP *:opsession-prxy (LISTEN) 检查端口 [root@backup 3307]# netstat -lntup|grep mysql tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 21648/mysqld tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 19986/mysqld 登陆多实例<a href="http://www.webjx.com/database/"><u>数据库</u></a> [root@backup ~]# mysql -S /data/3306/mysql.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.5.51-log Source distribution Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql&gt; create database data3306; Query OK, 1 row affected (0.00 sec) mysql&gt; show databases; +--------------------+ | Database | +--------------------+ | information_schema | | data3306 | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec) mysql&gt; quit Bye [root@backup ~]# mysql -S /data/3307/mysql.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.5.51 Source distribution Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql&gt; show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.05 sec) 成功登陆,并在3306实例中创建<a href="http://www.webjx.com/database/"><u>数据库</u></a>,但是3307实例上查看并没有创建过的数据,说明两个实例是独立的 注:如果再需要新增一个实例,基本的配置步骤同上述一样,只需要相应修改配置文件与启动程序文件中的端口号与数据目录的路径即可,最后可以将多实例<a href="http://www.webjx.com/database/"><u>数据库</u></a>启动命令加入开机自启动。 更多关于Mysql相关技术文章,请持续关注民工哥技术之路。如需要关注更多其它技术方向的文章,也可以关注民工哥的个人微信公众号:民工哥技术之路,关注 民工哥技术之路 微信公众号对话框回复关键字:1024 可以获取一份最新整理的技术干货:包括系统运维、<a href="http://www.webjx.com/database/"><u>数据库</u></a>、redis、MogoDB、电子书、Java基础课程、Java实战项目、架构师综合教程、架构师实战项目、大数据、Docker容器、ELK Stack、机器学习、BAT面试精讲视频等。

    Read more +
  • 13

    2019-04
    Mysql数据库名和表名在不同系统下的大小写敏感问题

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">Mysql数据库名和表名的大小写敏感性问题.</font> </td> </tr></tbody></table> <p>在 MySQL 中,数据库和表对应于那些目录下的目录和文件。因而,操作系统的敏感性决定数据库和表命名的大小写敏感。这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Unix 系统中是大小写敏感的。一个特例是 Mac OS X,当缺省的 HFS+ 文件系统使用时。然而 Mac OS X 还支持 UFS 卷,那些在 Mac OS X 是大小写敏感的就如他们在任一 Unix 上一样。查看章节 1.8.3 MySQL 对 ANSI SQL92 的扩展。 </p> <p>注意:尽管在 Windows 中数据库与表名是忽略大小写的,你不应该在同一个查询中使用不同的大小写来引用一个给定的数据库和表。下面的查询将不能工作,因为它以 my_table 和 MY_TABLE 引用一个表: </p> <p>mysql&gt; SELECT * FROM my_table WHERE MY_TABLE.col=1; </p> <p>列名与列的别名在所有的情况下均是忽略大小写的。 </p> <p>表的别名是区分大小写的。下面的查询将不能工作,因为它用 a 和 A 引用别名: </p> <p>mysql&gt; SELECT col_name FROM tbl_name AS a WHERE a.col_name = 1 OR A.col_name = 2; </p> <p>如果记忆数据库和表名的字母大小写有困难,建议采用一个一致一约定,例如总是以小写字母创建数据库和表。 </p> <p>避免这个问题的另一个办法就是以 -O lower_case_table_names=1 参数启动 mysqld。缺省地在 Windows 中这个选项为 1 ,在 Unix 中为 0。 </p> <p>如果 lower_case_table_names 为 1 ,MySQL 将在存储与查找时将所有的表名转换为小写字线。(从 MySQL 4.0.2 开始,这个选项同样适用于数据库名。) 注意,当你更改这个选项时,你必须在启动 mysqld 前首先将老的表名转换为小写字母。 </p> <p>$ pwd </p> <p>/data1/etl/aiinsight/ScheduleServer/mysql/support-files </p> <p>$ ./mysql.server stop </p> <p>$ pwd </p> <p>/data1/etl/aiinsight/ScheduleServer/mysql/bin </p> <p>./mysqld_safe --lower_case_table_names </p> <p>方法2:修改my.cnf配置文件 </p> <p>在[mysqld]节下加入 </p> <p>lower_case_table_names=1 </p>

    Read more +
  • 13

    2019-04
    mysql全文搜索:sql的写法

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">MySQL数据库对dvbbs.php全文搜索的完全分析.</font> </td> </tr></tbody></table> <p>首先,大家先去下载一份dvbbs.php beta1的代码,解压后先抛开php代码,找出你的mysql手册,如果没有手册那么就直接看下面的实例操作吧! </p> <p>mysql全文搜索,sql的写法: </p> <p>MATCH (col1,col2,…) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION]) </p> <p>比如: </p> <p>SELECT * FROM articles WHERE MATCH (title,body) AGAINST (’database’); </p> <p>MATCH()函数对于一个字符串执行资料库内的自然语言搜索。一个资料库就是1套1个或2个包含在FULLTEXT内的列。搜索字符串作为对 AGAINST()的参数而被给定。对于表中的每一行, MATCH() 返回一个相关值,即, 搜索字符串和 MATCH()表中指定列中该行文字之间的一个相似性度量。 </p> <p>下面的例子则更加复杂。询问返回相关值,同时对行按照相关性渐弱的顺序进行排序。为实现这个结果,你应该两次指定 MATCH(): 一次在 SELECT 列表中而另一次在 WHERE子句中。这不会引起额外的内务操作,原因是MySQL 优化程序注意到两个MATCH()调用是相同的,从而只会激活一次全文搜索代码。 </p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><font color="#ff0000">以下为引用的内容:</font></p> <p>mysql&gt; SELECT id, body, MATCH <br>(title,body) AGAINST<br>-&gt; (’Security implications of <br>running MySQL as root’) AS score<br>-&gt; FROM articles WHERE MATCH <br>(title,body) AGAINST<br>-&gt; (’Security implications of <br>running MySQL as root’);</p> </td> </tr></tbody></table> <p>所以,到这里你应该会mysql 英文全文搜索了. </p> <p>请注意一个问题. </p> <p>一些词在全文搜索中会被忽略: </p> <p>* 任何过于短的词都会被忽略。 全文搜索所能找到的词的默认最小长度为 4个字符。 </p> <p>* 停止字中的词会被忽略。 </p> <p>mysql还自带查询扩展功能.这里不做过多讨论. </p> <p>下面进行php中文全文搜索的分析 </p> <p>曾经有一个版本的mysql支持中文全文搜索(海量 mysql chinese+,说是GPL但是最终没有开源) </p> <p>中文全文搜索的关键是在分词上.mysql本身不支持cjk的分词(cjk:chinese,japanese,korean), </p> <p>所以 </p> <p>!!!!****如何用php模拟分词是mysql全文索引的关键****!!!! </p> <p>中文分词是语言分词中最困难的.现在也没有人能够彻底完美的解决(虽然这些搜索引擎做的都还不错.) </p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><font color="#ff0000">以下为引用的内容:</font></p> <p>//fcicq:下面给大家看看这里php的分词是怎么做的.<br>function &amp;DV_ChineseWordSegment($str,$encodingName=’gbk’){</p> <p>static $objEnc = null;</p> <p>if( $objEnc === null ){</p> <p>if( !class_exists(’DV_Encoding’) ){</p> <p>require_once ROOT_PATH.’inc/DV_Encoding.class.php’;</p> <p>}</p> <p>$objEnc =&amp; DV_Encoding::GetEncoding($encodingName);</p> <p>}</p> <p>$strLen = $objEnc-&gt;StrLength($str);</p> <p>$returnVal = array();</p> <p>if( $strLen &lt; = 1 ){</p> <p>return $str;</p> <p>}</p> <p>$arrStopWords =&amp; DV_GetStopWordList();</p> <p>//print_r($arrStopWords);</p> <p>//过滤所有HTML标签</p> <p>$str = preg_replace('#&lt;[a-zA-Z]+?.*?&gt;|#is’, ”, $str);</p> <p>//过滤所有stopword</p> <p>$str = str_replace($arrStopWords[’StrRepl’],’ ‘,$str);</p> <p>$str = preg_replace($arrStopWords[’PregRepl’],’ ‘,$str);</p> <p>//echo “$str:{$str}<br>“;</p> <p>$arr = explode(’ ‘,$str);</p> <p>//fcicq:好了,这下面的才是php分词关键 *************<br>foreach( $arr as $tmpStr ){</p> <p>if ( preg_match(”/^[x00-x7f]+$/i”,$tmpStr) === 1 ) <br>{ //fcicq:全是E文,没关系,mysql可以认识的</p> <p>$returnVal[] = ‘ ‘.$tmpStr;</p> <p>} else{ //fcicq:中英混合…</p> <p>preg_match_all(”/([a-zA-Z]+)/i”, $tmpStr, $matches);</p> <p>if( !empty($matches) ){ //fcicq:英语部分</p> <p>foreach( $matches[0] as $matche ){</p> <p>$returnVal[] = $matche;</p> <p>}</p> <p>}</p> <p>//过滤ASCII字符</p> <p>$tmpStr = preg_replace(”/([x00-x7f]+)/i”, ”<br>, $tmpStr); //fcicq:你看,剩下的不就全是中文了?</p> <p>$strLen = $objEnc-&gt;StrLength($tmpStr)-1;</p> <p>for( $i = 0 ; $i &lt; $strLen ; $i++ ){</p> <p>$returnVal[] = $objEnc-&gt;SubString($tmpStr,$i,2)<br>; //fcicq:注意这里的substr,不是手册上的.<br>//fcicq:你仔细看,所有的词都是分成两个.<br>//比如”数据库的应用”,会被分成数据 据库 库的 的应 应用…<br>//全文搜索: 全文 文搜 搜索<br>//这分词自然是不怎么样的<br>//但是,搜索的时候同样这么做.<br>//比如搜索数据库,就相当于搜索了数据 据库.<br>//这是一种相当传统的全文搜索分词方法.</p> <p>}</p> <p>}</p> <p>}</p> <p>return $returnVal;</p> <p>}//end function DV_ChineseWordSegment</p> <p>//fcicq:这就是传说中的substr.偶相信许多人写出来的php代码都比这个好.<br>function &amp;SubString(&amp;$str,$start,$length=null){</p> <p>if( !is_numeric($start) ){</p> <p>return false;</p> <p>}</p> <p>$strLen = strlen($str);</p> <p>if( $strLen &lt; = 0 ){</p> <p>return false;</p> <p>}</p> <p>if( $start &lt; 0 || $length &lt; 0 ){</p> <p>$mbStrLen = $this-&gt;StrLength($str);</p> <p>} else{</p> <p>$mbStrLen = $strLen;</p> <p>}</p> <p>if( !is_numeric($length) ){</p> <p>$length = $mbStrLen;</p> <p>} elseif( $length &lt; 0 ){</p> <p>$length = $mbStrLen + $length - 1;</p> <p>}</p> <p>if( $start &lt; 0 ){</p> <p>$start = $mbStrLen + $start;</p> <p>}</p> <p>$returnVal = '';</p> <p>$mbStart = 0;</p> <p>$mbCount = 0;</p> <p>for( $i = 0 ; $i &lt; $strLen ; $i++ ){</p> <p>if( $mbCount &gt;= $length ){</p> <p>break;</p> <p>}</p> <p>$currOrd = ord($str{$i});</p> <p>if( $mbStart &gt;= $start ){</p> <p>$returnVal .= $str{$i};</p> <p>if( $currOrd &gt; 0×7f ){</p> <p>$returnVal .= $str{$i+1}.$str{$i+2};</p> <p>$i += 2;</p> <p>}</p> <p>$mbCount++;</p> <p>} elseif( $currOrd &gt; 0×7f ){</p> <p>$i += 2;</p> <p>}</p> <p>$mbStart++;</p> <p>}</p> <p>return $returnVal;</p> <p>}//end function SubString</p> <p>//插入全文搜索分词表.一共两个,一个 topic_ft,一个bbs_ft</p> <p>$arrTopicIndex =&amp; DV_ChineseWordSegment($topic);</p> <p>if( !empty($arrTopicIndex) &amp;&amp; is_array($arrTopicIndex) ){</p> <p>$topicindex = $db-&gt;escape_string(implode(’ ‘,$arrTopicIndex));</p> <p>if( $topicindex !== ” ){</p> <p>$db-&gt;query(”UPD ATE {$dv}topic_ft SET topicindex=’<br>{$topicindex}’ WHERE topicid=’{$RootID}’”);</p> <p>} else{</p> <p>$db-&gt;query(”DEL ETE FROM {$dv}topic_ft<br>&#160;WHERE topicid=’{$RootID}’”);</p> <p>}</p> <p>}<br>}</p> </td> </tr></tbody></table> <p>这就是所谓的mysql全文搜索分词,mysql不会分词,而php会。就这么简单。</p> <p>这虽然是一种比较过时的方法,但是非常实用。</p>

    Read more +
  • 13

    2019-04
    SQL Server表的主键设计应注意的问题

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">本文主要针对开发应用中遇到在MS SQL Server上进行表设计时,对表的主键设计应注意的问题以及相应的解决办法。</font> </td> </tr></tbody></table> <p>关于数据库的逻辑设计,是一个很广泛的问题。本文主要针对开发应用中遇到在MS <a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server上进行表设计时,对表的主键设计应注意的问题以及相应的解决办法。</p> <p>主键设计现状和问题</p> <p>关于数据库表的主键设计,一般而言,是根据业务需求情况,以业务逻辑为基础,形成主键。</p> <p>比如,销售时要记录销售情况,一般需要两个表,一个是销售单的概要描述,记录诸如销售单号、总金额一类的情况,另外一个表记录每种商品的数量和金额。对于第一个表(主表),通常我们以单据号为主键;对于商品销售的明细表(从表),我们就需要将主表的单据号也放入到商品的明细表中,使其关联起来形成主从关系。同时该单据号与商品的编码一起,形成明细表的联合主键。这只是一般情况,我们稍微将这个问题延伸一下:假如在明细中,我们每种商品又可能以不同的价格方式销售。有部分按折扣价格销售,有部分按正常价格销售。要记录这些情况,那么我们就需要第三个表。而这第三个表的主键就需要第一个表的单据号以及第二个表的商品号再加上自身需要的信息一起构成联合主键;又或者其他情况,在第一个主表中,本身就是以联合方式构成联合主键,那么也需要在从表中将主表的多个字段添加进来联合在一起形成自己的主键。</p> <p>数据冗余存储:随着这种主从关系的延伸,数据库中需要重复存储的数据将变得越来越庞大。或者当主表本身就是联合主键时,就必须在从表中将所有的字段重新存储一次。</p> <p><a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a>复杂度增加:当存在多个字段的联合主键时,我们需要将主表的多个字段与子表的多个字段关联以获取满足某些条件的所有详细情况记录。</p> <p>程序复杂度增加:可能需要传递多个参数。</p> <p>效率降低:数据库系统需要判断更多的条件,<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a>语句长度增加。同时,联合主键自动生成联合索引</p> <p>WEB分页困难:由于是联合主键方式(对于多数的子表),那么在WEB页面上要进行分页处理时,在自关联时,难于处理。</p> <p>解决方案</p> <p>从上面,我们已经看到现有结构存在着相当多的弊端,主要是导致程序复杂、效率降低并且不利于分页。</p> <p>为解决上述问题,本文提出:当应用系统后台数据库表间存在主从关系时,数据库表额外增加一非业务字段作为主键,该字段为数值型;或者当该表需要在应用中进行分页查询时,也应考虑如此设计。一般地,我们也可以几乎为任何表增加一个与业务逻辑无关的字段作为该表的主键字段。</p> <p>由于该字段要作为表的主键,那么其首要条件是要保证在该表中要具有唯一性。同时,结合<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server数据库自身的特性,可以为其建立一个自增列:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p>create TABLE T_PK_DEMO<br>(<br>U_ID  BIGINT NOT NULL IDENTITY(1,1),<br>&#8211;唯一标识记录的ID<br>COL_OTHER VARchar(20) NOT NULL ,<br>&#8211;其他列<br>CONSTRAINT PK_T_PK_DEMO PRIMARY KEY NONCLUSTERED<br>(U_ID)&#8211;定义为主键<br>)</p> </td> </tr></tbody></table> <p>但是,<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server中的自增列却存在一个比较尴尬的事实,那就是该字段一旦定义和使用,用户无法直接干预该字段的值,完全由数据库系统自身控制:</p> <p>完全数据库系统控制,用户无法修改值</p> <p>在数据库的发布和订阅时,使用自增列会比较麻烦</p> <p>恢复部分数据时,使用自增列会比较麻烦</p> <p>该列的值必须在插入数据后才能获取</p> <p>鉴于此,建议不以自增列的方式来定义,而是参考Oracle数据库系统中序列,在<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server系统中实现类似Oracle数据库系统序列功能。这个具体在下面的小节中介绍。我们只需要按照普通字段的定义方式修改表定义为:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb">create TABLE T_PK_DEMO<br>(<br>U_ID  BIGINT NOT NULL ,&#8211;唯一标识记录的ID<br>COL_OTHER VARchar(20) NOT NULL ,&#8211;其他列<br>CONSTRAINT PK_T_PK_DEMO PRIMARY KEY NONCLUSTERED (U_ID)&#8211;定义为主键<br>)</td> </tr></tbody></table> <p></p>

    Read more +
  • 13

    2019-04
    在VB.net中连接MySql的类库

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">.Net编写类库直接操作MySql数据库应用实例.</font> </td> </tr></tbody></table> <p>这是在VB.net中为连接MySql中编写的一个类库。你可以使用这个类库直接操作MySql数据库。 </p> <p>在使用这个类库之前,你必须安装 </p> <p>ODBC MYSQL 3.51下载地址:http://www.mysql.com/downloads/api-myodbc-3.51.html </p> <p>Driver ODBC.NET下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyId=6CCD8427-1017-4F33-A062-D165078E32B1&amp;displaylang=en </p> <p>在这个库中有三个类: </p> <p>ManipStringForMySQL: 此类修改SGBD的字符串 </p> <p>MySQL_Requettes: 发送请求 </p> <p>MySQL_Utils : 对SGBD数据进行测试 </p> <p>下面是使用此类库操作MySql的一个例子 </p> <p>//对DataSet进行操作 </p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p>  Public Shared Function MyODBCDataset(ByVal ReqSQL As String, _<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ByVal LaBase As String, ByVal Server As String, _<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ByVal Password As String, ByVal User As String, _<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ByVal NomDataSet As String) As DataSet<br>&#160;&#160;&#160; ' Connexion à un server MySQL <br>&#160;&#160;&#160; 'avec le Driver ODBC 3.51 avec requette qui renvoie un dataset<br>&#160;&#160;&#160; Dim MyConString As String = _<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; "DRIVER={MySQL ODBC 3.51 Driver};SERVER=" &amp; Server _<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp; ";DATABASE=" &amp; LaBase &amp; ";UID=" &amp; User _<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp; ";PASSWORD=" &amp; Password &amp; ";OPTION=3;"</p> <p>Dim MyODBCConnexion As New OdbcConnection(MyConString)<br>&#160;&#160;&#160; Try<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Dim ds As New DataSet()<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Dim cmd As OdbcDataAdapter = New <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; OdbcDataAdapter(ReqSQL, MyConString)<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Dim MyCommand As New OdbcCommand()<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Dim MyDataReader As OdbcDataReader<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; cmd.Fill(ds, NomDataSet)<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; MyODBCConnexion.Close()<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Return ds<br>&#160;&#160;&#160; Catch MyOdbcException As OdbcException<br>&#160;&#160;&#160; ' <br>&#160;&#160;&#160;&#160;&#160; HttpContext.Current.Response.Write(MyOdbcException.ToString)<br>&#160;&#160;&#160; Catch MyException As Exception<br>&#160;&#160;&#160; ' <br>&#160;&#160;&#160;&#160;&#160; HttpContext.Current.Response.Write(MyException.ToString)<br>&#160;&#160;&#160; End Try<br>End Function</p> <p>&#160;&#160;&#160; //对函数的调用</p> <p>&#160; Dim MonDatasetTemp As DataSet = MySQL_Requettes.MyODBCDataset(<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; SQL,<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; constantes.ODBCBase, <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; constantes.ODBCServer, <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; constantes.ODBCPwd, <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; constantes.ODBCUser, <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; "MonDataset")</p> </td> </tr></tbody></table> <p>此程序用到的类库可在如下地址下载:http://www.codeproject.com/dotnet/MySQLConnexion/MySQLConnexion.zip</p>

    Read more +
  • 13

    2019-04
    SQL注入攻击:防御和检查SQL注入的手段

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">防御和检查SQL注入攻击的手段.</font> </td> </tr></tbody></table> 虽然前面有许多文章讨论了SQL注入,但今天所讨论的内容也许可帮助你检查自己的服务器,并采取相应防范措施。知彼知己,方可取胜。首先要清楚SQL注入攻击有哪些种类。 <p>观察近来的一些安全事件及其后果,安全专家们已经得到一个结论,这些威胁主要是通过SQL注入造成的。虽然前面有许多文章讨论了SQL注入,但今天所讨论的内容也许可帮助你检查自己的服务器,并采取相应防范措施。 </p> <p><strong>SQL注入攻击的种类</strong></p> <p>知彼知己,方可取胜。首先要清楚SQL注入攻击有哪些种类。</p> <p><strong>1.没有正确过滤转义字符</strong></p> <p>在用户的输入没有为转义字符过滤时,就会发生这种形式的注入式攻击,它会被传递给一个SQL语句。这样就会导致应用程序的终端用户对数据库上的语句实施操纵。比方说,下面的这行代码就会演示这种漏洞:</p> <p>statement := "SELECT * FROM users WHERE name = '" + userName + "';"</p> <p>这种代码的设计目的是将一个特定的用户从其用户表中取出,但是,如果用户名被一个恶意的用户用一种特定的方式伪造,这个语句所执行的操作可能就不仅仅是代码的作者所期望的那样了。例如,将用户名变量(即username)设置为:</p> <p>a' or 't'='t,此时原始语句发生了变化:</p> <p>SELECT * FROM users WHERE name = 'a' OR 't'='t';</p> <p>如果这种代码被用于一个认证过程,那么这个例子就能够强迫选择一个合法的用户名,因为赋值't'='t永远是正确的。</p> <p>在一些SQL服务器上,如在SQL Server中,任何一个SQL命令都可以通过这种方法被注入,包括执行多个语句。下面语句中的username的值将会导致删除“users”表,又可以从“data”表中选择所有的数据(实际上就是透露了每一个用户的信息)。</p> <p>a';DROP TABLE users; SELECT * FROM data WHERE name LIKE '%</p> <p>这就将最终的SQL语句变成下面这个样子:</p> <p>SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT *</p> <p>FROM DATA WHERE name LIKE '%';</p> <p>其它的SQL执行不会将执行同样查询中的多个命令作为一项安全措施。这会防止攻击者注入完全独立的查询,不过却不会阻止攻击者修改查询。</p> <p><strong>2.Incorrect type handling</strong></p> <p>如果一个用户提供的字段并非一个强类型,或者没有实施类型强制,就会发生这种形式的攻击。当在一个SQL语句中使用一个数字字段时,如果程序员没有检查用户输入的合法性(是否为数字型)就会发生这种攻击。例如:</p> <p>statement := "SELECT * FROM data WHERE id = " + a_variable + ";"</p> <p>从这个语句可以看出,作者希望a_variable是一个与“id”字段有关的数字。不过,如果终端用户选择一个字符串,就绕过了对转义字符的需要。例如,将a_variable设置为:1;DROP TABLE users,它会将“users”表从数据库中删除,SQL语句变成:SELECT * FROM DATA WHERE id = 1;DROP TABLE users;</p> <p><strong>3.数据库服务器中的漏洞</strong></p> <p>有时,数据库服务器软件中也存在着漏洞,如MYSQL服务器中mysql_real_escape_string()函数漏洞。这种漏洞允许一个攻击者根据错误的统一字符编码执行一次成功的SQL注入式攻击。</p> <p><strong>4.盲目SQL注入式攻击</strong></p> <p>当一个Web应用程序易于遭受攻击而其结果对攻击者却不见时,就会发生所谓的盲目SQL注入式攻击。有漏洞的网页可能并不会显示数据,而是根据注入到合法语句中的逻辑语句的结果显示不同的内容。这种攻击相当耗时,因为必须为每一个获得的字节而精心构造一个新的语句。但是一旦漏洞的位置和目标信息的位置被确立以后,一种称为Absinthe的工具就可以使这种攻击自动化。</p> <p><strong>5.条件响应</strong></p> <p>注意,有一种SQL注入迫使数据库在一个普通的应用程序屏幕上计算一个逻辑语句的值:</p> <p>SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=1</p> <p>这会导致一个标准的面面,而语句</p> <p>SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=2在页面易于受到SQL注入式攻击时,它有可能给出一个不同的结果。如此这般的一次注入将会证明盲目的SQL注入是可能的,它会使攻击者根据另外一个表中的某字段内容设计可以评判真伪的语句。</p> <p><strong>6.条件性差错</strong></p> <p>如果WHERE语句为真,这种类型的盲目SQL注入会迫使数据库评判一个引起错误的语句,从而导致一个SQL错误。例如:</p> <p>SELECT 1/0 FROM users WHERE username='Ralph'。显然,如果用户Ralph存在的话,被零除将导致错误。</p> <p><strong>7.时间延误</strong></p> <p>时间延误是一种盲目的SQL注入,根据所注入的逻辑,它可以导致SQL引擎执行一个长队列或者是一个时间延误语句。攻击者可以衡量页面加载的时间,从而决定所注入的语句是否为真。</p> <p>以上仅是对SQL攻击的粗略分类。但从技术上讲,如今的SQL注入攻击者们在如何找出有漏洞的网站方面更加聪明,也更加全面了。出现了一些新型的SQL攻击手段。黑客们可以使用各种工具来加速漏洞的利用过程。我们不妨看看the Asprox Trojan这种木马,它主要通过一个发布邮件的僵尸网络来传播,其整个工作过程可以这样描述:首先,通过受到控制的主机发送的垃圾邮件将此木马安装到电脑上,然后,受到此木马感染的电脑会下载一段二进制代码,在其启动时,它会使用搜索引擎搜索用微软的ASP技术建立表单的、有漏洞的网站。搜索的结果就成为SQL注入攻击的靶子清单。接着,这个木马会向这些站点发动SQL注入式攻击,使有些网站受到控制、破坏。访问这些受到控制和破坏的网站的用户将会受到欺骗,从另外一个站点下载一段恶意的JavaScript代码。最后,这段代码将用户指引到第三个站点,这里有更多的恶意软件,如窃取口令的木马。</p> <p>以前,我们经常警告或建议Web应用程序的程序员们对其代码进行测试并打补丁,虽然SQL注入漏洞被发现和利用的机率并不太高。但近来攻击者们越来越多地发现并恶意地利用这些漏洞。因此,在部署其软件之前,开发人员应当更加主动地测试其代码,并在新的漏洞出现后立即对代码打补丁。</p> <p><strong>防御和检查SQL注入的手段</strong></p> <p><strong>1.使用参数化的过滤性语句</strong></p> <p>要防御SQL注入,用户的输入就绝对不能直接被嵌入到SQL语句中。恰恰相反,用户的输入必须进行过滤,或者使用参数化的语句。参数化的语句使用参数而不是将用户输入嵌入到语句中。在多数情况中,SQL语句就得以修正。然后,用户输入就被限于一个参数。下面是一个使用Java和JDBC API例子:</p> <p>PreparedStatement prep = conn.prepareStatement("SELECT * FROM USERS WHERE</p> <p>PASSWORD=?");</p> <p>prep.setString(1, pwd);</p> <p>总体上讲,有两种方法可以保证应用程序不易受到SQL注入的攻击,一是使用代码复查,二是强迫使用参数化语句的。强迫使用参数化的语句意味着嵌入用户输入的SQL语句在运行时将被拒绝。不过,目前支持这种特性的并不多。如H2 数据库引擎就支持。</p> <p><strong>2.还要避免使用解释程序,因为这正是黑客们借以执行非法命令的手段。</strong></p> <p><strong>3.防范SQL注入,还要避免出现一些详细的错误消息,因为黑客们可以利用这些消息。要使用一种标准的输入确认机制来验证所有的输入数据的长度、类型、语句、企业规则等。</strong></p> <p><strong>4.使用专业的漏洞扫描工具。但防御SQL注入攻击也是不够的。</strong>攻击者们目前正在自动搜索攻击目标并实施攻击。其技术甚至可以轻易地被应用于其它的Web架构中的漏洞。企业应当投资于一些专业的漏洞扫描工具,如大名鼎鼎的Acunetix的Web漏洞扫描程序等。一个完善的漏洞扫描程序不同于网络扫描程序,它专门查找网站上的SQL注入式漏洞。最新的漏洞扫描程序可以查找最新发现的漏洞。</p> <p><strong>5.最后一点,企业要在Web应用程序开发过程的所有阶段实施代码的安全检查。</strong>首先,要在部署Web应用之前实施安全测试,这种措施的意义比以前更大、更深远。企业还应当在部署之后用漏洞扫描工具和站点监视工具对网站进行测试。</p> <p>Web安全拉警报已经响起,安全形式异常严峻,企业绝对不应当草率从事。安全重于泰山!</p>

    Read more +
  • 13

    2019-04
    SQL教程:SQL Server备份和灾难恢复

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">SQL教程:SQL Server备份和灾难恢复.</font> </td> </tr></tbody></table> <p align="center"><strong>SQL Server备份和灾难恢复</strong></p> <p>数据处理在现代企业运营中变得越来越重要,越来越关键,甚至会成为企业发展的一项瓶颈. 数据保护的重要性也不言而喻. 如果一个企业没有很好的数据保护方案或策略的话,一旦发生重要数据丢失,后果将会是灾难性的,伴随着会有经济利益方面的损失.</p> <p>各大服务器硬件厂商(IBM,HP等)提供有很好的数据保护策略(硬件或软件).如大家熟知的RAID磁盘阵列(Redundant Array of Independent Disks)就是很好的数据保护方法.就SQL Server而言,通过维护计划可以制定详细的数据备份计划.</p> <p align="center"><img border="0" src="http://www.webjx.com/files/allimg/100709/1849580.jpg" width="491" height="439" alt=""></p> <p>数据备份策略(full backup, differential backup and&#160; transaction log backup)</p> <p>数据备份是为数据恢复服务的,所以建立数据备份计划之前,应先考虑是否能利用该备份有效的恢复数据(在downtime允许的时间范围内).还应先考虑系统允许的RPO(Recovery Point Objective,灾难发生后,系统或数据必须恢复的时间点), RTO(Recovery Time Objective,指当灾难发生后,所采用的系统复原工具或解决方案,可让系统或数据恢复到正常运作的状况时,所需花费的时间).</p> <p>有三种通常使用的备份计划:</p> <p>(1). 只有全备份</p> <p align="center"><img border="0" src="http://www.webjx.com/files/allimg/100709/1849581.jpg" width="510" height="186" alt=""></p> <p>两个全备份之间的时间段发生故障,数据会丢失,只能恢复到上一个全备份的数据.</p> <p></p>

    Read more +
  • 13

    2019-04
    SQL Server数据库对于应用程序的关系

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">以下的文章主要是介绍SQL Server数据库与其实际应用元数据,我前两天在相关网站看见SQL Server数据库与其实际应用元数据的资料,觉得挺好,就拿出来供大家分享,希望会给大家带来一些帮助在此方面。 我常被问到如何把驻留在物理服务器/SQL 实例上的SQL Server数据库转</font> </td> </tr></tbody></table> <p>  以下的文章主要是介绍<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>与其实际应用元数据,我前两天在相关网站看见<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>与其实际应用元数据的资料,觉得挺好,就拿出来供大家分享,希望会给大家带来一些帮助在此方面。</p> <p>  我常被问到如何把驻留在物理服务器/<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> 实例上的<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>转变为它们相应的应用程序名称。在准备计划好的服务器停机通知时,这种需要就产生了,但在我的组织内与IT经理或非技术人员沟通时,这也是有价值的。如果你不是数据</p> <p>  我常被问到如何把驻留在物理服务器/<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> 实例上的<a href="http://www.webjx.com/database/"><u>数据库</u></a>转变为它们相应的应用程序名称。在准备计划好的服务器停机通知时,这种需要就产生了,但在我的组织内与IT经理或非技术人员沟通时,这也是有价值的。</p> <p>  如果你不是<a href="http://www.webjx.com/database/"><u>数据库</u></a>管理员或特定<a href="http://www.webjx.com/database/"><u>数据库</u></a>的应用分析师,你通常会无视<a href="http://www.webjx.com/database/"><u>数据库</u></a>的命名规则,而这些<a href="http://www.webjx.com/database/"><u>数据库</u></a>支持着你每日依赖的应用程序。这就是为什么当需要产生时在适当的位置上由元<a href="http://www.webjx.com/database/"><u>数据库</u></a>来提供转化很重要。</p> <p>  专家解答</p> <p>  大部分<a href="http://www.webjx.com/database/"><u>数据库</u></a>管理员拥有某种形式的<a href="http://www.webjx.com/database/"><u>数据库</u></a>元<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>,他们依赖其来跟踪范围很广的Microsoft <a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a>环境。我利用连接的服务器和分布式<a href="http://www.webjx.com/database/"><u>数据库</u></a>访问来建立一个已经在我的环境中使用了七年的元<a href="http://www.webjx.com/database/"><u>数据库</u></a>。它不是漂亮的,但它是功能性很强的。</p> <p>  跟很多IT开发者和<a href="http://www.webjx.com/database/"><u>数据库</u></a>管理员一样,即使它有自身的不足我还是为自己的创造感到骄傲。它很慢,不像它可以的那样最新型,也不像它应该的那样安全。</p> <p>  自从读了2007年5月和6月Rodney Landrum在<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a>杂志上发表的关于<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a>集成服务(SSIS)和<a href="http://www.webjx.com/database/"><u>数据库</u></a>管理员知识库(DBA Repositories)的文章,我知道是时候采取别人的解决方法了。这对于我的环境来说是完美的,而一些改动也是容易采纳的。</p> <p>  2008年2月,一篇后续文章在<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a>杂志上发表,在这篇文章里,Rodney更新了他的解决方法。我下载了代码,在我的测试环境里审核,并迅速把它纳入产品中。当大家普遍地为这个解决方法所提供的而感到高兴时,在它包中缺少的一方面是把<a href="http://www.webjx.com/database/"><u>数据库</u></a>关联到应用程序的能力。</p> <p>  通过在他的解决方法中增加两张额外的表,我可以在我的“土生土长”元<a href="http://www.webjx.com/database/"><u>数据库</u></a>中增加应用程序元数据到我现在使用的<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a>杂志的方法中。</p> <p>  增加到我<a href="http://www.webjx.com/database/"><u>数据库</u></a>中的应用元数据包括创建两张表:dbo.Applications,专为存储所有程序的应用名称,而这些程序在我的环境中依赖于<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>,还有</p> <p>  dbo.Database_Applications,它保存<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> 实例、<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>和应用程序之间的关系。</p> <p>  Applications Table CREATE TABLE [dbo].[Applications] (</p> <p>  [AppID] [int] IDENTITY(154,1) NOT NULL,</p> <p>  [ApplicationName] [varchar](100) NOT NULL, )</p> <p>  Database_Applications Table</p> <p>  CREATE TABLE [dbo].[Database_Applications] (</p> <p>  [DB_AppID] [int] IDENTITY(1,1) NOT NULL,</p> <p>  [<a href="http://www.webjx.com/server/"><u>Server</u></a>Name] [varchar](50) NOT NULL,</p> <p>  [DatabaseName] [varchar](100) NOT NULL,</p> <p>  [ApplicationName] [varchar](100) NULL )</p> <p>  你可能注意到,我没有规范化dbo.Database_Applications表。如果我规范化,我会只存储两个区域:一个与存储我的应用元数据的表有关的外键,和一个与我的元<a href="http://www.webjx.com/database/"><u>数据库</u></a>相对应的外键。我有自己的原因:</p> <p>  我没有处理大量的数据:我有大概800个<a href="http://www.webjx.com/database/"><u>数据库</u></a>,这些<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>在我的环境里发布80个实例。虽然这对于一个<a href="http://www.webjx.com/database/"><u>数据库</u></a>管理员来说是个很大的环境,但是它既不转变成在我的元数据表里的大量纪录,也不转变成<a href="http://www.webjx.com/database/"><u>数据库</u></a>的巨大字节。</p> <p>  不是通过dbo.Applications表的主键,而是包含表中的应用程序名,我可以通过只访问dbo.Database_Applications表产生我的主要应用程序元数据报告(key Application Metadata report)。</p> <p>  我的环境中的<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a>元<a href="http://www.webjx.com/database/"><u>数据库</u></a>使用“焦土政策”人口处理方法,除了<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Agent Job History和Backup History,其他的表都被每天删除和重新载入。我发现在</p> <p>  dbo.Database_Applications表中保存信息可以使我的生活变得很容易。</p> <p>  每日从我的环境中载入数据后,我可以通过以下脚本得到在我的环境中产生的任何新的<a href="http://www.webjx.com/database/"><u>数据库</u></a>的良好的陈述。</p> <p>  SELECT D.[<a href="http://www.webjx.com/server/"><u>Server</u></a>], D.DatabaseName FROM dbo.Databases D LEFT JOIN dbo.Database_Applications DA ON D.DatabaseName = DA.DatabaseName AND D.[<a href="http://www.webjx.com/server/"><u>Server</u></a>] = DA.[<a href="http://www.webjx.com/server/"><u>Server</u></a>Name] WHERE DA.DB_AppID IS NULL ORDER BY D.[<a href="http://www.webjx.com/server/"><u>Server</u></a>], D.DatabaseName 这个查询的结果提供任何<a href="http://www.webjx.com/database/"><u>数据库</u></a>的清单,这些<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>产生于上次我更新应用元数据和服务器时,它不仅是跨域的<a href="http://www.webjx.com/database/"><u>数据库</u></a>创建活动的通知,也是致力于更新两个<a href="http://www.webjx.com/database/"><u>数据库</u></a>来符合应用程序信息的数据清单。这个查询也适合<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a> Reporting Services报告的数据表,而当我不在办公室时,<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a> Reporting Services报告也为我提供了一个新的<a href="http://www.webjx.com/database/"><u>数据库</u></a>到我的黑莓(BlackBerry)的日常通知。</p> <p>  最后,我创建了以下存储程序,由此用任何新的<a href="http://www.webjx.com/database/"><u>数据库</u></a>信息来合并dbo.Applications表和dbo.Database_Applications 表。它接受三个参数:服务器,<a href="http://www.webjx.com/database/"><u>数据库</u></a>和应用程序。如果应用程序已经不存在于dbo.Applications表中,它就会被补充。然后一个记录被插入到服务器/<a href="http://www.webjx.com/database/"><u>数据库</u></a>/应用程序关系中的dbo.Applications表。</p> <p>  CREATE PROCEDURE [dbo].[pAdd_Application]</p> <p>  @<a href="http://www.webjx.com/server/"><u>Server</u></a>Name varchar(50),</p> <p>  @DatabaseName varchar(100),</p> <p>  @ApplicationName varchar(100)</p> <p>  AS --Add any new databases created,</p> <p>  but not recorded in the repository, to the repository</p> <p>  UPDATE dbo.Database_Applications</p> <p>  SET ApplicationName = @ApplicationName</p> <p>  WHERE <a href="http://www.webjx.com/server/"><u>Server</u></a>Name = @<a href="http://www.webjx.com/server/"><u>Server</u></a>Name</p> <p>  AND DatabaseName = @DatabaseName</p> <p>  AND ApplicationName IS NULL</p> <p>  --Determine if there is already an application</p> <p>  for this database in the repository, if not, then add it</p> <p>  IF (SELECT COUNT(*) FROM dbo.Applications</p> <p>  WHERE ApplicationName = @ApplicationName) = 0</p> <p>  BEGIN INSERT INTO dbo.Applications (ApplicationName)</p> <p>  VALUES (@ApplicationName)</p> <p>  PRINT 'Added new Application: '</p> <p>  + @ApplicationName + ' to Applications table'</p> <p>  SELECT * FROM dbo.Applications</p> <p>  WHERE ApplicationName = @ApplicationName</p> <p>  END --List the new record in the repository</p> <p>  SELECT <a href="http://www.webjx.com/server/"><u>Server</u></a>Name, DatabaseName, ApplicationName</p> <p>  FROM dbo.Database_Applications</p> <p>  WHERE <a href="http://www.webjx.com/server/"><u>Server</u></a>Name = @<a href="http://www.webjx.com/server/"><u>Server</u></a>Name</p> <p>  AND DatabaseName = @DatabaseName</p> <p>  AND ApplicationName = @ApplicationName</p> <p>  虽然我可以很容易地把这个存储程序的执行整合为<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a>集成服务(SSIS)程序包中的最后一步,而这个程序包能够组装我的存储<a href="http://www.webjx.com/database/"><u>数据库</u></a>,但我选择不这样做,这是为了在我的环境里,我能密切关注围绕新的<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>创造而展开的活动。</p>

    Read more +
  • 13

    2019-04
    SQL Server允许重复空字段不空字段值唯一

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">SQL Server如何保证可空字段中非空值唯一.</font> </td> </tr></tbody></table> <p>今天同学向我提了一个问题,我觉得蛮有意思,现记录下来大家探讨下。问题是:在一个表里面,有一个允许为空的字段,空是可以重复的,但是不为空的值需要唯一。</p> <p>表结构如下面代码创建</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><font color="#ff0000">以下为引用的内容:</font></p> <div> <span style="COLOR: #0000ff; FONT-SIZE: 12pt">CREATE</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">TABLE</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;test_tb<br></span><span style="COLOR: #000000; FONT-SIZE: 12pt">(<br></span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;&#160;&#160;&#160;TestId&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">int</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #808080; FONT-SIZE: 12pt">not</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">null</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #ff00ff; FONT-SIZE: 12pt">identity</span><span style="COLOR: #000000; FONT-SIZE: 12pt">(</span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">1</span><span style="COLOR: #000000; FONT-SIZE: 12pt">,</span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">1</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">primary</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">key</span><span style="COLOR: #000000; FONT-SIZE: 12pt">,<br></span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;&#160;&#160;&#160;Caption&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">nvarchar</span><span style="COLOR: #000000; FONT-SIZE: 12pt">(</span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">100</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">null</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000; FONT-SIZE: 12pt">);<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span> </div> </td> </tr></tbody></table> <p>解决方案1:</p> <p>对于这个问题,大家的第一个想法可能是:在Caption这个字段上面加一个唯一键不就可以了吗?好,我们按着这个思路做下去,先创建唯一索引。</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><font color="#ff0000">以下为引用的内容:</font></p> <div> <span style="COLOR: #0000ff; FONT-SIZE: 12pt">CREATE</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">UNIQUE</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">NONCLUSTERED</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INDEX</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;un_test_tb&#160;<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">ON</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;test_tb(Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span> </div> </td> </tr></tbody></table> <p>索引创建好了,我们来测试下效果</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><font color="#ff0000">以下为引用的内容:</font></p> <div> <span style="COLOR: #0000ff; FONT-SIZE: 12pt">INSERT</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INTO</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;test_tb&#160;(Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">VALUES</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;(</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">null</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INSERT</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INTO</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;test_tb&#160;(Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">VALUES</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;(</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">null</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span> </div> </td> </tr></tbody></table> <p>运行之后我们会收到下面的错误信息:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><font color="#ff0000">以下为引用的内容:</font></p> <div><span style="COLOR: #000000; FONT-SIZE: 12pt"> <div> <span style="COLOR: #000000; FONT-SIZE: 12pt">消息&#160;</span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">2601</span><span style="COLOR: #000000; FONT-SIZE: 12pt">,级别&#160;</span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">14</span><span style="COLOR: #000000; FONT-SIZE: 12pt">,状态&#160;</span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">1</span><span style="COLOR: #000000; FONT-SIZE: 12pt">,第&#160;</span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">1</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;行<br></span><span style="COLOR: #000000; FONT-SIZE: 12pt">不能在具有唯一索引&#160;</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">un_test_tb</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;的对象&#160;</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">dbo.test_tb</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;中插入重复键的行。<br></span><span style="COLOR: #000000; FONT-SIZE: 12pt">语句已终止。</span> </div> </span></div> </td> </tr></tbody></table> <p>所以该解决方案是不行的。</p> <p>解决方案2:</p> <p>添加约束,让<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server在插入数据的时候,先验证下已有数据中是否有现在要插入的这个值。由于这个约束不是简单的一个运算,因此我们先创建一个函数,然后再在约束中调用这个函数。</p> <p>创建验证逻辑函数:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><font color="#ff0000">以下为引用的内容:</font></p> <div> <span style="COLOR: #0000ff; FONT-SIZE: 12pt">CREATE</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">FUNCTION</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">[</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">dbo</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">]</span><span style="COLOR: #000000; FONT-SIZE: 12pt">.</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">[</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">fn_CK_test_tb_Caption</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">]</span><span style="COLOR: #000000; FONT-SIZE: 12pt">()<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">RETURNS</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">BIT</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">AS</span><span style="COLOR: #000000">&#160;<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">BEGIN</span><span style="COLOR: #000000"><br>&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">IF</span><span style="COLOR: #000000; FONT-SIZE: 12pt">(</span><span style="COLOR: #808080; FONT-SIZE: 12pt">EXISTS</span><span style="COLOR: #000000; FONT-SIZE: 12pt">(<br>&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">SELECT</span><span style="COLOR: #000000">&#160;&#160;&#160;&#160;</span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">1</span><span style="COLOR: #000000"><br>&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">FROM</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;test_tb&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">AS</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;a<br>&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">WHERE</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;(Caption&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">IS</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #808080; FONT-SIZE: 12pt">NOT</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">NULL</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)&#160;</span><span style="COLOR: #808080; FONT-SIZE: 12pt">AND</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #808080; FONT-SIZE: 12pt">EXISTS</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;&#160;&#160;&#160;&#160;&#160;(</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">SELECT</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">1</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">AS</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;Expr1<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">FROM</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;test_tb<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">WHERE</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;(Caption&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">IS</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #808080; FONT-SIZE: 12pt">NOT</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">NULL</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)&#160;</span><span style="COLOR: #808080; FONT-SIZE: 12pt">AND</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;(Caption&#160;</span><span style="COLOR: #808080; FONT-SIZE: 12pt">=</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;a.Caption)&#160;</span><span style="COLOR: #808080; FONT-SIZE: 12pt">AND</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;(a.TestId&#160;</span><span style="COLOR: #808080; FONT-SIZE: 12pt">&lt;&gt;</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;TestId))<br></span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;&#160;&#160;&#160;&#160;))<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">RETURN</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">0</span><span style="COLOR: #000000"><br>&#160;&#160;&#160;&#160;<br>&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">RETURN</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">1</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">END</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span> </div> </td> </tr></tbody></table> <p>在约束中引用函数:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><font color="#ff0000">以下为引用的内容:</font></p> <div> <span style="COLOR: #0000ff; FONT-SIZE: 12pt">ALTER</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">TABLE</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;test_tb<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">ADD</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">CONSTRAINT</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;CK_test_tb_Caption&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">CHECK</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;(dbo.fn_CK_test_tb_Caption()&#160;</span><span style="COLOR: #808080; FONT-SIZE: 12pt">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">1</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span> </div> </td> </tr></tbody></table> <p>现在来测试下效果。先来测试NULL值</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><font color="#ff0000">以下为引用的内容:</font></p> <div> <span style="COLOR: #0000ff; FONT-SIZE: 12pt">INSERT</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INTO</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;test_tb&#160;(Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">VALUES</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;(</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">null</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INSERT</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INTO</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;test_tb&#160;(Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">VALUES</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;(</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">null</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">SELECT</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #808080; FONT-SIZE: 12pt">*</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">FROM</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;test_tb<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span> </div> </td> </tr></tbody></table> <p>可以成功运行,而且也出了多行为NULL的情况。现在再来测试不为空的插入情况。</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><font color="#ff0000">以下为引用的内容:</font></p> <div><span style="COLOR: #0000ff; FONT-SIZE: 12pt"> <div> <span style="COLOR: #0000ff; FONT-SIZE: 12pt">INSERT</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INTO</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;test_tb&#160;(Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">VALUES</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;(N</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">AAA</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INSERT</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INTO</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;test_tb&#160;(Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">VALUES</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;(N</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">BBB</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INSERT</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INTO</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;test_tb&#160;(Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">VALUES</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;(N</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">BBB</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">SELECT</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #808080; FONT-SIZE: 12pt">*</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">FROM</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;test_tb<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span> </div> </span></div> </td> </tr></tbody></table> <p>结果是在第三条语句的时候报错了,表中的Caption字段也有‘AAA’和‘BBB’了,这也正好是我们要的结果。</p> <p>所以解决方案2是正确的。但是为了这么一个小小功能,就写这么长一段东西是不是太繁琐了呢?我们来看下面的解决方案。</p> <p>解决方案3:(只适用于<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server 2008)</p> <p><a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server 2008中有了一个优雅的解决方案,那就是筛选索引。筛选索引是一种经过优化的非聚集索引,尤其适用于涵盖从定义完善的数据子集中选择数据的查询。筛选索引使用筛选谓词对表中的部分行进行索引。有了筛选索引,我们只需要写一条语句就达到上面的效果。</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><font color="#ff0000">以下为引用的内容:</font></p> <div> <span style="COLOR: #0000ff; FONT-SIZE: 12pt">CREATE</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">UNIQUE</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">NONCLUSTERED</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INDEX</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;un_test_tb&#160;<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">ON</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;test_tb(Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">WHERE</span><span style="COLOR: #000000; FONT-SIZE: 12pt">&#160;Caption&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">is</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #808080; FONT-SIZE: 12pt">not</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">null</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span> </div> </td> </tr></tbody></table> <p>再用上面的一些测试语句来测试的话,会发现完全是达到了我们的要求。这个方案的唯一缺点就是该语句只有<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server 2008支持。不知道各位有没有又优雅又适用于各个版本的<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server的解决方案,望不胜赐教。(来源:<a href="http://www.cnblogs.com/caspnet/archive/2011/02/23/1962638.html" target="_blank"><font color="#0000ff">博客园</font></a>)</p>

    Read more +
  • 13

    2019-04
    详细讲解MySQL复制

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">MySQL复制的概述、安装、故障、技巧、工具.</font> </td> </tr></tbody></table> <p>同<a href="http://www.mongodb.org/" target="_blank"><font color="#0000ff">MongoDB</font></a>,<a href="http://redis.io/" target="_blank"><font color="#0000ff">Redis</font></a>这样的NoSQL数据库的复制相比,<a href="http://dev.mysql.com/doc/refman/5.5/en/replication.html" target="_blank"><font color="#0000ff">MySQL复制</font></a>显得相当复杂!</p> <p>概述</p> <p>首先主服务器把数据变化记录到主日志,然后从服务器通过I/O线程读取主服务器上的主日志,并且把它写入到从服务器的中继日志中,接着SQL线程读取中继日志,并且在从服务器上重放,从而实现MySQL复制。具体如下图所示:</p> <p align="center"><img border="0" alt="MySQL复制" src="http://www.webjx.com/files/allimg/110406/1657080.png" width="510" height="330"></p> <p align="center">MySQL复制</p> <p>整个过程反映到从服务器上,对应三套日志信息,可在从服务器上用如下命令查看:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font face="NSimsun">mysql&gt; SHOW SLAVE STATUS;</font></code></p> </td> </tr></tbody></table> <p>Master_Log_File &amp; Read_Master_Log_Pos:下一个传输的主日志信息。</p> <p>Relay_Master_Log_File &amp; Exec_Master_Log_Pos:下一个执行的主日志信息。</p> <p>Relay_Log_File &amp; Relay_Log_Pos:下一个执行的中继日志信息。</p> <p>理解这些日志信息的含义对于解决故障至关重要,后文会详细阐述。</p> <p>安装</p> <p>先在主服务器上创建复制账号:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font face="NSimsun">mysql&gt; GRANT REPLICATION SLAVE ON *.*<br>&#160;&#160;&#160;&#160;&#160;&#160; TO '&lt;SLAVE_USER&gt;'@'&lt;SLAVE_HOST&gt;'<br>&#160;&#160;&#160;&#160;&#160;&#160; IDENTIFIED BY '&lt;SLAVE_PASSWORD&gt;';</font></code></p> </td> </tr></tbody></table> <p>注:出于安全性和灵活性的考虑,不要把root等具有<a href="http://dev.mysql.com/doc/refman/5.5/en/privileges-provided.html#priv_super" target="_blank"><font color="#0000ff">SUPER</font></a>权限用户作为复制账号。</p> <p>然后设置主服务器配置文件(缺省:/etc/my.cnf):</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font face="NSimsun">[mysqld]<br><br>server_id = 100<br>log_bin = mysql-bin<br>log_bin_index = mysql-bin.index<br>sync_binlog = 1<br>innodb_flush_log_at_trx_commit = 1<br>innodb_support_xa = 1</font></code></p> </td> </tr></tbody></table> <p>注:一定要保证主从服务器各自的server_id唯一,避免冲突。</p> <p>注:如果没有指定<a href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_log_bin" target="_blank"><font color="#0000ff">log_bin</font></a>的话,缺省会使用主机名作为名字,如此一来一旦主机名发生改变,就会出问题,所以推荐指定log_bin(从服务器的relay_log存在一样的问题)。</p> <p>注:<a href="http://dev.mysql.com/doc/refman/5.5/en/replication-options-binary-log.html#sysvar_sync_binlog" target="_blank"><font color="#0000ff">sync_binlog</font></a>,<a href="http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit" target="_blank"><font color="#0000ff">innodb_flush_log_at_trx_commit</font></a>,<a href="http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_support_xa" target="_blank"><font color="#0000ff">innodb_support_xa</font></a>三个选项都是出于安全目的设置的,不是复制的必须选项。</p> <p>接着设置从服务器配置文件(缺省:/etc/my.cnf):</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font face="NSimsun">[mysqld]<br><br>server_id = 200<br>log_bin = mysql-bin<br>log_bin_index = mysql-bin.index<br>relay_log = mysql-relay-bin<br>relay_log_index = mysql-relay-bin.index<br>read_only = 1<br>skip_slave_start = 1<br>log_slave_updates = 1</font></code></p> </td> </tr></tbody></table> <p>注:如果用户有SUPER权限,则<a href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_read_only" target="_blank"><font color="#0000ff">read_only</font></a>无效。</p> <p>注:有了<a href="http://dev.mysql.com/doc/refman/5.5/en/replication-options-slave.html#option_mysqld_skip-slave-start" target="_blank"><font color="#0000ff">skip_slave_start</font></a>,除非使用<a href="http://dev.mysql.com/doc/refman/5.5/en/start-slave.html" target="_blank"><font color="#0000ff">START SLAVE</font></a>命令,否则从服务器不会开始复制。</p> <p>注:设置<a href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_log_slave_updates" target="_blank"><font color="#0000ff">log_slave_updates</font></a>,让从服务器记录日志,有助于在必要时把从切换成主。</p> <p>下面最重要的步骤是如何克隆一份主服务器的数据:</p> <p>如果数据库使用的是MyISAM表类型的话,可按如下方式操作:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font face="NSimsun">shell&gt; mysqldump --all-databases --master-data=1 &gt; data.sql</font></code></p> </td> </tr></tbody></table> <p>注:<a href="http://dev.mysql.com/doc/refman/5.5/en/mysqldump.html#option_mysqldump_master-data" target="_blank"><font color="#0000ff">master-data</font></a>选项缺省会打开<a href="http://dev.mysql.com/doc/refman/5.5/en/mysqldump.html#option_mysqldump_lock-all-tables" target="_blank"><font color="#0000ff">lock-all-tables</font></a>,并写入<a href="http://dev.mysql.com/doc/refman/5.5/en/change-master-to.html" target="_blank"><font color="#0000ff">CHANGE MASTER TO</font></a>语句。</p> <p>如果数据库使用的是InnoDB表类型的话,则应该使用<a href="http://dev.mysql.com/doc/refman/5.5/en/mysqldump.html#option_mysqldump_single-transaction" target="_blank"><font color="#0000ff">single-transcation</font></a>:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font face="NSimsun">shell&gt; mysqldump --all-databases --single-transaction --master-data=1 &gt; data.sql</font></code></p> </td> </tr></tbody></table> <p>有了数据文件,传输到从服务器上并导入:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font face="NSimsun">shell&gt; mysql &lt; data.sql</font></code></p> </td> </tr></tbody></table> <p>如果数据量很大的话,mysqldump会非常慢,此时直接拷贝数据文件能节省不少时间:</p> <p>在拷贝之前要先锁定数据,然后再获得相关的日志信息(FILE &amp; POSITION):</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font face="NSimsun">mysql&gt; FLUSH TABLES WITH READ LOCK;</font></code></p> <p><code><font face="NSimsun">mysql&gt; SHOW MASTER STATUS;</font></code></p> </td> </tr></tbody></table> <p>接下来拷贝数据文件时,如果是MyISAM表类型的话,直接拷贝即可;如果是InnoDB表类型的话,一定要先停止MySQL服务再拷贝,否则拷贝文件可能无法使用。把拷贝的数据文件直接复制到从服务器的数据目录。</p> <p>最后还需要再指定一下日志信息:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font face="NSimsun">mysql&gt; CHANGE MASTER TO<br>&#160;&#160;&#160;&#160;&#160;&#160; MASTER_HOST='&lt;MASTER_HOST&gt;',<br>&#160;&#160;&#160;&#160;&#160;&#160; MASTER_USER='&lt;SLAVE_USER&gt;',<br>&#160;&#160;&#160;&#160;&#160;&#160; MASTER_PASSWORD='&lt;SLAVE_PASSWORD&gt;',<br>&#160;&#160;&#160;&#160;&#160;&#160; MASTER_LOG_FILE='&lt;FILE&gt;',<br>&#160;&#160;&#160;&#160;&#160;&#160; MASTER_LOG_POS=&lt;POSITION&gt;;</font></code></p> </td> </tr></tbody></table> <p>注:不要在my.cnf配置文件里设置MASTER_USER和MASTER_PASSWORD,因为最终生效的是CHANGE MASTER TO生成的master.info文件里的信息。</p> <p>在主服务器上直接拷贝数据文件虽然很快,但需要锁表或者停止服务,这会影响线上服务。如果先前已经有了从服务器,那么可以用旧的从服务器做母本来克隆新的从服务器:</p> <p>先在旧的从服务器上查询日志信息:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font face="NSimsun">mysql&gt; SHOW SLAVE STATUS;</font></code></p> </td> </tr></tbody></table> <p>我们需要的是其中的Relay_Master_Log_File &amp; Exec_Master_Log_Pos。</p> <p>然后在旧的从服务器上按照前面的方法得到数据,并在新的从服务器上还原。</p> <p>接着在新的从服务器上设置日志信息:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font face="NSimsun">mysql&gt; CHANGE MASTER TO<br>&#160;&#160;&#160;&#160;&#160;&#160; MASTER_HOST='&lt;MASTER_HOST&gt;',<br>&#160;&#160;&#160;&#160;&#160;&#160; MASTER_USER='&lt;SLAVE_USER&gt;',<br>&#160;&#160;&#160;&#160;&#160;&#160; MASTER_PASSWORD='&lt;SLAVE_PASSWORD&gt;',<br>&#160;&#160;&#160;&#160;&#160;&#160; MASTER_LOG_FILE='&lt;Relay_Master_Log_File&gt;',<br>&#160;&#160;&#160;&#160;&#160;&#160; MASTER_LOG_POS=&lt;Exec_Master_Log_Pos&gt;;</font></code></p> </td> </tr></tbody></table> <p>不管用那个方法,最后记得在从服务器上启动复制,并检查工作是否正常:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font face="NSimsun">mysql&gt; START SLAVE;</font></code></p> <p><code><font face="NSimsun">mysql&gt; SHOW SLAVE STATUS;</font></code></p> </td> </tr></tbody></table> <p>如果IO线程和SQL线程都显示Yes,就可以感谢上帝了:</p> <p>Slave_IO_Running 对应:Master_Log_File &amp; Read_Master_Log_Pos</p> <p>Slave_SQL_Running 对应:Relay_Master_Log_File &amp; Exec_Master_Log_Pos</p> <p>如果显示No,则说明前面某些配置步骤出错,或者对应的日志文件有问题。</p> <p>故障</p> <p>问题:主从复制不止何故停止了,我该怎么办?</p> <p>答案:复制错误多半是因为日志错误引起的,所以首先要搞清楚是主日志错误还是中继日志错误,从错误信息里一般就能判断,如果不能可以使用类似下面的mysqlbinlog命令:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font face="NSimsun">shell&gt; mysqlbinlog &lt;MASTER_BINLOG_FILE&gt; &gt; /dev/null</font></code></p> <p><code><font face="NSimsun">shell&gt; mysqlbinlog &lt;SLAVE_BINLOG_FILE&gt; &gt; /dev/null</font></code></p> </td> </tr></tbody></table> <p>如果没有错误,则不会有任何输出,反之如果有错误,则会显示出来。</p> <p>如果是主日志错误,则需要在从服务器使用<a href="http://dev.mysql.com/doc/refman/5.5/en/set-global-sql-slave-skip-counter.html" target="_blank"><font color="#0000ff">SET GLOBAL sql_slave_skip_counter</font></a>,如下:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font face="NSimsun">mysql&gt; SET GLOBAL sql_slave_skip_counter = 1;</font></code></p> <p><code><font face="NSimsun">mysql&gt; START SLAVE;</font></code></p> </td> </tr></tbody></table> <p>注:如果有多个错误,可能需要执行多次(提醒:主从服务器数据可能因此不一致)。</p> <p>如果是中继日志错误,只要在从服务器使用SHOW SLAVE STATUS结果中的日志信息重新CHANGE MASTER TO即可,系统会抛弃当前的中继日志,重新下载:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font face="NSimsun">mysql&gt; CHANGE MASTER TO<br>&#160;&#160;&#160;&#160;&#160;&#160; MASTER_LOG_FILE='&lt;Relay_Master_Log_File&gt;',<br>&#160;&#160;&#160;&#160;&#160;&#160; MASTER_LOG_POS=&lt;Exec_Master_Log_Pos&gt;;<br>mysql&gt; START SLAVE;</font></code></p> </td> </tr></tbody></table> <p>至于为什么使用的是Relay_Master_Log_File &amp; Exec_Master_Log_Pos,参见概述。</p> <p>问题:主服务器宕机了,如何把从服务器提升会主服务器?</p> <p>答案:在一主多从的环境总,需选择数据最新的从服务器做新的主服务器。如下图所示:</p> <p align="center"><img border="0" alt="提升从服务器为主服务器" src="http://www.webjx.com/files/allimg/110406/1657081.png" width="500" height="470"></p> <p align="center">提升从服务器为主服务器</p> <p>在一主(Server1)两从(Server2,、Server3)的环境中,Server1宕机后,等到Server1和Server2把宕机前同步到的日志都执行完,比较Master_Log_File和Read_Master_Log_Pos就可以判断出谁快谁慢,因为Server2从 Server1同步的数据(1582)比Server3从Server1同步的数据(1493)新,所以应该提升Server2为新的主服务器,那么 Server3在CHANGE MASTER TO到Server2的时候应该使用什么样的参数呢?1582-1493=89,而Server2的最后的二进制日志位置是8167,所以答案是 8167-89=8078。</p> <p><strong>技巧</strong></p> <p>主从服务器中的表可以使用不同的表类型。比如主服务器可以使用InnoDB表类型,提供事务,行锁等高级特性,从服务器可以使用MyISAM表类型,内存消耗少,易备份等优点。还有一个例子,一台主服务器如果同时带很多个从服务器的话,势必会影响其性能,此时可以拿出一台服务器作为从服务器代理,使用BLACKHOLE表类型,只记录日志,不写数据,由它带多台从服务器,从而提升性能。</p> <p>主从服务器中的表可以使用不同的键类型。比如主服务器用InnoDB,键用VARCHAR的话节省空间,从服务器使用MyISAM,键用CHAR提高速度,因为MyISAM有静态表一说。</p> <p>主从服务器中的表可以使用不同的索引。主服务器主要用来应付写操作,所以除了主键和唯一索引等保证数据关系的索引一般都可以不加,从服务器一般用来应付读操作,所以可以针对查询特征设置索引,再进一步,不同的从服务器可以针对不同的查询设置不同的索引。</p> <p><strong>工具</strong></p> <p>有一些优秀的工具可以让你的复制工作得到事半功倍的效果,详细内容请参考各自文档:</p> <p><a href="http://mysql-mmm.org/" target="_blank"><font color="#0000ff">Multi-Master Replication Manager for MySQL</font></a></p> <p><a href="http://www.percona.com/software/percona-xtrabackup/" target="_blank"><font color="#0000ff">Percona XtraBackup</font></a></p> <p><a href="http://www.maatkit.org/" target="_blank"><font color="#0000ff">Maatkit</font></a></p> <p><a href="http://code.google.com/p/tungsten-replicator/" target="_blank"><font color="#0000ff">Tungsten-replicator</font></a></p> <p>此外,Google Project Hosting里还有很多有趣的项目,可用<a href="http://code.google.com/hosting/search?q=label:mysql+replication" target="_blank"><font color="#0000ff">mysql+replication</font></a>标签搜索。</p> <p>说明:本文参考了下面列出的书籍中相关的内容:</p> <p><a href="http://www.amazon.com/High-Performance-MySQL-Optimization-Replication/dp/0596101716/" target="_blank"><font color="#0000ff">High Performance MySQL: Optimization, Backups, Replication, and More</font></a></p> <p><a href="http://www.amazon.com/MySQL-High-Availability-Building-Centers/dp/0596807309/" target="_blank"><font color="#0000ff">MySQL High Availability: Tools for Building Robust Data Centers</font></a></p> <p>(来源:<a href="http://huoding.com/2011/04/05/59" target="_blank"><font color="#0000ff">火丁笔记</font></a>)</p>

    Read more +
  • 13

    2019-04
    MySql数据库插入式的多存储引擎机制

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">浅谈MySQL的存储引擎之表类型存储.</font> </td> </tr></tbody></table> <p>什么是MySql数据库?</p> <p>通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合。</p> <p>我们通常说的MySql数据库,sql server数据库等等其实是数据库管理系统,它们可以存储数据,并提供查询和更新数据库中的数据的功能等等。根据数据库如何存储数据和如何操作数据的实现机制不同,这些数据库之间即有区别又有共同点。</p> <p>MySql数据库是开放源代码的关系型数据库。目前,它可以提供的功能有:支持sql语言、子查询、存储过程、触发器、视图、索引、事务、锁、外键约束和影像复制等。在后期,我们会详细讲解这些功能。</p> <p>同Oracle 和SQL Server等大型数据库系统一样,MySql也是客户/服务器系统并且是单进程多线程架构的数据库。</p> <p>MySql区别于其它数据库系统的一个重要特点是支持插入式存储引擎。</p> <p>那么什么是存储引擎呢?</p> <p>存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。</p> <p>在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。</p> <p>MySql中有哪些存储引擎?</p> <p>1 MyISAM:这种引擎是mysql最早提供的。这种引擎又可以分为静态MyISAM、动态MyISAM 和压缩MyISAM三种:</p> <p>静态MyISAM:如果数据表中的各数据列的长度都是预先固定好的,服务器将自动选择这种表类型。因为数据表中每一条记录所占用的空间都是一样的,所以这种表存取和更新的效率非常高。当数据受损时,恢复工作也比较容易做。</p> <p>动态MyISAM:如果数据表中出现varchar、xxxtext或xxxBLOB字段时,服务器将自动选择这种表类型。相对于静态MyISAM,这种表存储空间比较小,但由于每条记录的长度不一,所以多次修改数据后,数据表中的数据就可能离散的存储在内存中,进而导致执行效率下降。同时,内存中也可能会出现很多碎片。因此,这种类型的表要经常用optimize table 命令或优化工具来进行碎片整理。</p> <p>压缩MyISAM:以上说到的两种类型的表都可以用myisamchk工具压缩。这种类型的表进一步减小了占用的存储,但是这种表压缩之后不能再被修改。另外,因为是压缩数据,所以这种表在读取的时候要先时行解压缩。</p> <p>但是,不管是何种MyISAM表,目前它都不支持事务,行级锁和外键约束的功能。</p> <p>2 MyISAM Merge引擎:这种类型是MyISAM类型的一种变种。合并表是将几个相同的MyISAM表合并为一个虚表。常应用于日志和数据仓库。</p> <p>3 InnoDB:InnoDB表类型可以看作是对MyISAM的进一步更新产品,它提供了事务、行级锁机制和外键约束的功能。</p> <p>4 memory(heap):这种类型的数据表只存在于内存中。它使用散列索引,所以数据的存取速度非常快。因为是存在于内存中,所以这种类型常应用于临时表中。</p> <p>5 archive:这种类型只支持select 和 insert语句,而且不支持索引。常应用于日志记录和聚合分析方面。</p> <p>当然MySql支持的表类型不止上面几种。</p> <p>下面我们介绍一下如何查看和设置数据表类型。</p> <p>MySql中关于存储引擎的操作</p> <p>1 查看数据库可以支持的存储引擎</p> <p>用show engines; 命令可以显示当前数据库支持的存储引擎情况,如图1所示:</p> <p align="center"><img border="0" alt="" src="http://www.webjx.com/files/allimg/110525/0731340.jpg" width="573" height="160"></p> <p align="center">图1 数据库的存储引擎</p> <p>由上图可见当前系统的默认数据表类型是MyISAM。当然,我们可以通过修改数据库配置文件中的选项,设定默认表类型。</p> <p>2 查看表的结构等信息的若干命令</p> <p>要查看表的定义结构等信息可以使用以下几种命令:</p> <p>2.1Desc[ribe] tablename; //查看数据表的结构</p> <p>例如,查看表t1的结构,可得下图。</p> <p align="center"><img border="0" alt="" src="http://www.webjx.com/files/allimg/110525/0731341.jpg" width="580" height="141"></p> <p align="center">图2:查看表t1的结构</p> <p>2.2 Show create table tablename; //显示表的创建语句</p> <p>同上查询表t1,得下图:</p> <p align="center"><img border="0" alt="" src="http://www.webjx.com/files/allimg/110525/0731342.jpg" width="533" height="234"></p> <p align="center">图3 显示创建表t1的语句</p> <p>2.3 show table status like ‘tablename’G显示表的当前状态值</p> <p>同上查询表t1,得下图:</p> <p align="center"><img border="0" alt="" src="http://www.webjx.com/files/allimg/110525/0731343.jpg" width="498" height="344"></p> <p align="center">图4 显示表t1 的当前状态值</p> <p>综上可见,后两种方式都可以帮助我们查看某一表的存储引擎类型(图中已用红色方框标出)。</p> <p>3 设置或修改表的存储引擎</p> <p>3.1创建数据库表时设置存储存储引擎的基本语法是:</p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><font color="#ff0000"></font></p> <ol class="dp-sql"> <li class="alt"> <span><span class="keyword"><strong><font color="#006699">Create</font></strong></span><span>&#160;</span><span class="keyword"><strong><font color="#006699">table</font></strong></span><span>&#160;tableName( &#160;</span></span> </li> <li> <span>columnName(列名1)&#160;&#160;type(数据类型)&#160;&#160;attri(属性设置), &#160;</span> </li> <li class="alt"> <span>columnName(列名2)&#160;&#160;type(数据类型)&#160;&#160;attri(属性设置), &#160;</span> </li> <li> <span>……..)&#160;engine&#160;=&#160;engineName&#160;</span> </li> </ol> </td> </tr></tbody></table> <p>例如,假设要创建一个名为user的表,此表包括id,用户名username和性别sex三个字段,并且要设置表类型为merge。则可用如下的方式创建此数据表,</p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><font color="#ff0000"></font></p> <ol class="dp-sql"> <li class="alt"> <span><span class="keyword"><strong><font color="#006699">create</font></strong></span><span>&#160;</span><span class="keyword"><strong><font color="#006699">table</font></strong></span><span>&#160;</span><span class="func"><font color="#ff1493">user</font></span><span>( &#160;</span></span> </li> <li> <span>&#160;&#160;id&#160;</span><span class="keyword"><strong><font color="#006699">int</font></strong></span><span>&#160;</span><span class="op"><font color="#808080">not</font></span><span>&#160;</span><span class="op"><font color="#808080">null</font></span><span>&#160;auto_increment, &#160;</span> </li> <li class="alt"> <span>&#160;&#160;username&#160;</span><span class="keyword"><strong><font color="#006699">char</font></strong></span><span>(20)&#160;</span><span class="op"><font color="#808080">not</font></span><span>&#160;</span><span class="op"><font color="#808080">null</font></span><span>, &#160;</span> </li> <li> <span>&#160;&#160;sex&#160;</span><span class="keyword"><strong><font color="#006699">char</font></strong></span><span>(2), &#160;</span> </li> <li class="alt"> <span>&#160;&#160;</span><span class="keyword"><strong><font color="#006699">primary</font></strong></span><span>&#160;</span><span class="keyword"><strong><font color="#006699">key</font></strong></span><span>(id) &#160;</span> </li> <li> <span>)&#160;engine=merge&#160;</span> </li> </ol> </td> </tr></tbody></table> <p>&#160;具体执行结果见下图:</p> <p align="center"><img border="0" alt="" src="http://www.webjx.com/files/allimg/110525/0731344.jpg" width="400" height="123"></p> <p align="center">图5 创建表user</p> <p>查看创建后表user的信息,可见表的当前存储引擎是merge,如图所示:</p> <p align="center"><img border="0" alt="" src="http://www.webjx.com/files/allimg/110525/0731345.jpg" width="483" height="345"></p> <p align="center">图6 显示表t1 的当前状态值</p> <p>3.2修改存储引擎,可以用命令Alter table tableName engine =engineName</p> <p>假如,若需要将表user的存储引擎修改为archive类型,则可使用命令alter table user engine=archive。如下图所示:</p> <p align="center"><img border="0" alt="" src="http://www.webjx.com/files/allimg/110525/0731346.jpg" width="423" height="61"></p> <p align="center">图7 修改表user的存储引擎</p> <p>查看修改后的表类型,可见表类型已经变为archive类型。</p> <p align="center"><img border="0" alt="" src="http://www.webjx.com/files/allimg/110525/0731347.jpg" width="498" height="339"></p> <p align="center">图8 显示表user修改后的状态值</p> <p>小结</p> <p>在本文中主要介绍了什么是MySql数据库,并进一步引出了它的一个重要特性, 即插入式的多存储引擎机制。然后,简单介绍了什么是存储引擎和MySql中几种主要的存储引擎。最后,介绍了如何查看数据库支持的所有存储引擎,如何查看数据库表的存储引擎类型及如何设置或修改表的存储引擎类型。刚刚入门学习MySql,文中有错误之处,还请大家多多指导!</p>

    Read more +
  • 13

    2019-04
    sql server2005(数据库安全性和参照完整性)

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">sql server2005(数据库安全性和参照完整性)</font> </td> </tr></tbody></table> <p> --创建登录账号</p> <p> create login username with password='password'</p> <p> --创建数据库用户</p> <p> create user username for login username</p> <p> ---授予该用户对Student表的查询权限,同时授予其进一步授权其他用户的权利。</p> <p> grant select</p> <p> on student</p> <p> to user_tom</p> <p> with grant option</p> <p> -----</p> <p> create login marry with password='marry001'</p> <p> create user user_marry for login marry</p> <p> --创建角色</p> <p> create role dbnormuser</p> <p> ---对角色授权</p> <p> grant select</p> <p> on student</p> <p> to dbnormuser</p> <p> --指定固定的服务器角色(登录名)</p> <p> sp_addsrvrolemember marry,sysadmin</p> <p> 删除</p> <p> &#160;sp_dropsrvrolemember marry,sysadmin</p> <p> --查看用户</p> <p> sp_helpuser</p> <p> ---新建外键约束</p> <p> ALTER TABLE test_sub ADD CONSTRAINT main_id_cons FOREIGN KEY (main_id) REFERENCES test_main;</p> <p> ---删除外键</p> <p> ALTER TABLE test_sub drop CONSTRAINT main_id_cons</p> <p> --创建级联删除外键</p> <p> ALTER TABLE test_sub ADD CONSTRAINT main_id_cons FOREIGN KEY (main_id) REFERENCES test_main on delete</p> <p> cascade</p> <p> --创建级联更新外键</p> <p> ALTER TABLE test_sub ADD CONSTRAINT main_id_cons FOREIGN KEY (main_id) REFERENCES test_main on update</p> <p> cascade</p> <p> --创建删除被参照主键是 键参照关系的外键设置为null</p> <p> ALTER TABLE test_sub ADD CONSTRAINT main_id_cons FOREIGN KEY (main_id) REFERENCES test_main on update</p> <p> set null</p> <p> &#160;</p> <p> ----参照完整性</p> <p> 不能删除 带有外键的记录</p>

    Read more +
  • 13

    2019-04
    MySQL数据库生产环境的维护工作总结的经验

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">MySQL生产环境维护之表数据的DML操作.</font> </td> </tr></tbody></table> &#160;从过往MySQL数据库生产环境的维护工作中,总结的一些小经验和知识,未必有多深奥,但是对我们消除隐患,确保MySQL数据库生产环境四个9的作用非常有效之一的手段,运维人员要非常注意细节,尽量减低故障发生的概率。 <p>  <strong>(一) DML语句书写建议</strong></p> <p> <strong> (1). DML语句不允许出现@number方式替代字段名称</strong></p> <p>  不合理的写法:</p> <p>  UPDATE table_name SET @1=NOW() WHERE @2=1;</p> <p>  正确的写法:</p> <p>  UPDATE table_name SET column_name1=NOW() WHERE column_name2=1;</p> <p><strong>  (2). UPDATE OR DELETE 禁用LIMIT子句</strong></p> <p>  不合理的写法:</p> <p>  UPDATE table_name SET column_name1=NOW() WHERE column_name2=1 LIMIT 1;</p> <p>  正确的写法:</p> <p>  UPDATE table_name SET column_name1=NOW() WHERE column_name2=1;</p> <p>  <strong>(3). INSERT语句需要写清楚值和字段对应关系</strong></p> <p>  不合理的写法:</p> <p>  INSERT INTO table_name VALUES(NOW(),DATE_ADD(NOW(),INTERVAL +1 DAY));</p> <p>  正确的写法:</p> <p>  INSERT INTO table_name(gmt_create,gmt_modify) VALUES(NOW(),DATE_ADD(NOW(),INTERVAL +1 DAY));</p> <p><strong>  (4). DML语句少用不确定性函数</strong></p> <p>  常见被大家使用的不确定性函数:UUID()、RAND()、SYSDATE()等函数,若无特殊用处之外,请以确定性函数替代之。</p> <p>  推荐阅读的技术文章:曾用于内部培训的PPT内容:MySQL开发规范与实用技术交流</p> <p><strong>  (二) 大数据量的DELETE OR UPDATE</strong></p> <p>  可能出于某些原因和运营目的,需要对数据库中的数据进行大量的清理或更改某字段的值,分别举 二个示例:</p> <p>  ① 网络专项整治的时期,需要删除大量含某些关键词的内容;</p> <p>  ② 给符合某一条件(例如:等级,在线时长)的游戏玩家,赠送100~1000不等数量的游戏币;</p> <p>  给出的2个数据修改需求示例,若是直接根据相关要求去做,一个是需要用到模糊查询,另一个数据更新条件也没有合理索引可用,为此可能造成表对象表级锁被长时间锁住,而且阻塞其他更改类型数据操作服务,所以我们不得不采用更合理的办法,建议如下步骤实施:</p> <p>  ① 设计并创建一张表tmp_pk_data ,用于记录将要被修改记录的主键,及需要的相关信息;</p> <p>  ② 优先考虑在备库上跑一条SQL命令或存储过程的方式,把主键及相关数据写到表tmp_pk_data中;</p> <p>  ③ 编写一个存储过程,使用游标循环控制获得tmp_pd_data的信息,根据主键更新或删除目标表的数据,且建议此操作在备库上完成(注释:必须是双主复制模式,才可在备库上执行);</p> <p>  <strong>(三) 定期规律性清理数据的DELETE</strong></p> <p>  定期规律性数据的清理,优先对目标表的数据操纵方式进行分类:</p> <p>  ① 若是日志类型的数据,则完全可以改为借助分区表的方式,比如按日期删除数据的条件,则可以用日期作为数据分区条件,然后增删分区的方式实现数据的清理工作;</p> <p>  ② 若是数据的UPDATE/DELETE/SELECT操纵条件,与定期清理数据的规则一致或被其包含,则可以考虑使用分区表,然后借助删除分区方式达到数据清理的目标;</p> <p>  ③ 若不能使用分区表解决的,则可以考虑参考上章节介绍的“大数据量的DELETE OR UPDATE”内容;</p> <p> <strong> (四) M-M架构的大数据量DML技巧</strong></p> <p>  定期规律性数据的清理,优先对目标表的数据操纵方式进行分类:</p> <p>  ① 若是日志类型的数据,则完全可以改为借助分区表的方式,比如按日期删除数据的条件,则可以用日期作为数据分区条件,然后增删分区的方式实现数据的清理工作;</p> <p>  ② 若是数据的UPDATE/DELETE/SELECT操纵条件,与定期清理数据的规则一致或被其包含,则可以考虑使用分区表,然后借助删除分区方式达到数据清理的目标;</p> <p>  ③ 若不能使用分区表解决的,则可以考虑参考上章节介绍的“大数据量的DELETE OR UPDATE”内容;</p>

    Read more +
  • 13

    2019-04
    Mysql数据库备份和还原常用的命令

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">Mysql数据库备份和还原常用的命令.</font> </td> </tr></tbody></table> <u><strong><font color="#617b85">Mysql</font></strong></u>数据库备份和还原常用的命令是进行Mysql数据库备份和还原的关键,没有命令,<u><strong><font color="#617b85">什</font></strong></u>么都无从做起,更谈不上什么备份还原,只有给系统这个命令,让它去执行,才能完成Mysql数据库备份和还原的操作,下面就是操作的常用命令。 <p><strong>一、备份命令</strong></p> <p>1、备份MySQL数据库的命令</p> <div style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; PADDING-BOTTOM: 4px; PADDING-LEFT: 5.4pt; WIDTH: 97%; PADDING-RIGHT: 5.4pt; BACKGROUND: #e6e6e6; WORD-BREAK: break-all; BORDER-TOP: windowtext 0.5pt solid; BORDER-RIGHT: windowtext 0.5pt solid; PADDING-TOP: 4px" id="div_code"> <style type="text/css"> #div_code img{border:0px;}</style> <div> <!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #000000">  mysqldump</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">hhostname</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">uusername</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">ppassword databasename</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">backupfile.sql</span> </div> </div> <p>2、备份MySQL数据库为带删除表的格式</p> <p>备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库。</p> <div style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; PADDING-BOTTOM: 4px; PADDING-LEFT: 5.4pt; WIDTH: 97%; PADDING-RIGHT: 5.4pt; BACKGROUND: #e6e6e6; WORD-BREAK: break-all; BORDER-TOP: windowtext 0.5pt solid; BORDER-RIGHT: windowtext 0.5pt solid; PADDING-TOP: 4px" id="div_code"> <style type="text/css"> #div_code img{border:0px;}</style> <div> <!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #000000">  mysqldump</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&#8211;add</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">drop</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">table</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">uusername</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">ppassword databasename</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">backupfile.sql</span> </div> </div> <p>3、直接将MySQL数据库压缩备份</p> <div style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; PADDING-BOTTOM: 4px; PADDING-LEFT: 5.4pt; WIDTH: 97%; PADDING-RIGHT: 5.4pt; BACKGROUND: #e6e6e6; WORD-BREAK: break-all; BORDER-TOP: windowtext 0.5pt solid; BORDER-RIGHT: windowtext 0.5pt solid; PADDING-TOP: 4px" id="div_code"> <style type="text/css"> #div_code img{border:0px;}</style> <div> <!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #000000">  mysqldump</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">hhostname</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">uusername</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">ppassword databasename</span><span style="COLOR: #808080">|</span><span style="COLOR: #000000">gzip</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">backupfile.sql.gz</span> </div> </div> <p>4、备份MySQL数据库某个(些)表</p> <div style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; PADDING-BOTTOM: 4px; PADDING-LEFT: 5.4pt; WIDTH: 97%; PADDING-RIGHT: 5.4pt; BACKGROUND: #e6e6e6; WORD-BREAK: break-all; BORDER-TOP: windowtext 0.5pt solid; BORDER-RIGHT: windowtext 0.5pt solid; PADDING-TOP: 4px" id="div_code"> <style type="text/css"> #div_code img{border:0px;}</style> <div> <!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #000000">  mysqldump</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">hhostname</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">uusername</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">ppassword databasename specific_table1 specific_table2</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">backupfile.sql</span> </div> </div> <p>5、同时备份多个MySQL数据库</p> <div style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; PADDING-BOTTOM: 4px; PADDING-LEFT: 5.4pt; WIDTH: 97%; PADDING-RIGHT: 5.4pt; BACKGROUND: #e6e6e6; WORD-BREAK: break-all; BORDER-TOP: windowtext 0.5pt solid; BORDER-RIGHT: windowtext 0.5pt solid; PADDING-TOP: 4px" id="div_code"> <style type="text/css"> #div_code img{border:0px;}</style> <div> <!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #000000">  mysqldump</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">hhostname</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">uusername</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">ppassword &#8211;databases databasename1 databasename2 databasename3</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">multibackupfile.sql</span> </div> </div> <p>6、仅仅备份数据库结构</p> <div style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; PADDING-BOTTOM: 4px; PADDING-LEFT: 5.4pt; WIDTH: 97%; PADDING-RIGHT: 5.4pt; BACKGROUND: #e6e6e6; WORD-BREAK: break-all; BORDER-TOP: windowtext 0.5pt solid; BORDER-RIGHT: windowtext 0.5pt solid; PADDING-TOP: 4px" id="div_code"> <style type="text/css"> #div_code img{border:0px;}</style> <div> <!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #000000">  mysqldump &#8211;no</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">data &#8211;databases databasename1 databasename2 databasename3</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">structurebackupfile.sql</span> </div> </div> <p>7、备份<u><strong><font color="#617b85">服务器</font></strong></u>上所有数据库</p> <div style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; PADDING-BOTTOM: 4px; PADDING-LEFT: 5.4pt; WIDTH: 97%; PADDING-RIGHT: 5.4pt; BACKGROUND: #e6e6e6; WORD-BREAK: break-all; BORDER-TOP: windowtext 0.5pt solid; BORDER-RIGHT: windowtext 0.5pt solid; PADDING-TOP: 4px" id="div_code"> <style type="text/css"> #div_code img{border:0px;}</style> <div> <!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #000000">  mysqldump &#8211;</span><span style="COLOR: #808080">all-</span><span style="COLOR: #000000">databases</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">allbackupfile.sql</span> </div> </div> <p><strong>二、还原命令</strong></p> <p>1、还原MySQL数据库的命令</p> <div style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; PADDING-BOTTOM: 4px; PADDING-LEFT: 5.4pt; WIDTH: 97%; PADDING-RIGHT: 5.4pt; BACKGROUND: #e6e6e6; WORD-BREAK: break-all; BORDER-TOP: windowtext 0.5pt solid; BORDER-RIGHT: windowtext 0.5pt solid; PADDING-TOP: 4px" id="div_code"> <style type="text/css"> #div_code img{border:0px;}</style> <div> <!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #000000">  mysql</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">hhostname</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">uusername</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">ppassword databasename</span><span style="COLOR: #808080">&lt;</span><span style="COLOR: #000000">backupfile.sql</span> </div> </div> <p>2、还原压缩的MySQL数据库</p> <div style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; PADDING-BOTTOM: 4px; PADDING-LEFT: 5.4pt; WIDTH: 97%; PADDING-RIGHT: 5.4pt; BACKGROUND: #e6e6e6; WORD-BREAK: break-all; BORDER-TOP: windowtext 0.5pt solid; BORDER-RIGHT: windowtext 0.5pt solid; PADDING-TOP: 4px" id="div_code"> <style type="text/css"> #div_code img{border:0px;}</style> <div> <!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #000000">  gunzip</span><span style="COLOR: #808080">&lt;</span><span style="COLOR: #000000">backupfile.sql.gz</span><span style="COLOR: #808080">|</span><span style="COLOR: #000000">mysql</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">uusername</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">ppassword databasename</span> </div> </div> <p>3、将数据库转移到新<font color="#000000">服务器</font></p> <div style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; PADDING-BOTTOM: 4px; PADDING-LEFT: 5.4pt; WIDTH: 97%; PADDING-RIGHT: 5.4pt; BACKGROUND: #e6e6e6; WORD-BREAK: break-all; BORDER-TOP: windowtext 0.5pt solid; BORDER-RIGHT: windowtext 0.5pt solid; PADDING-TOP: 4px" id="div_code"> <style type="text/css"> #div_code img{border:0px;}</style> <div> <!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #000000">  mysqldump</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">uusername</span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">ppassword databasename</span><span style="COLOR: #808080">|</span><span style="COLOR: #000000">mysql &#8211;host</span><span style="COLOR: #808080">=*</span><span style="COLOR: #000000">.</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">.</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">.</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000"></span><span style="COLOR: #808080">-</span><span style="COLOR: #000000">C databasename</span> </div> </div> <p>总结:</p> <p>做好数据备份和还原,定好合适的备份策略,这是一个DBA所做事情的一小部分,万事开头难,就从现在开始吧!</p>

    Read more +
  • 13

    2019-04
    MSSql实例教程:MSSql数据库同步

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">MS Sql 数据库同步.</font> </td> </tr></tbody></table> <p><strong>1:环境</strong><br>服务器环境:<br>机器名称: ZehuaDb (mssql)<br>操作系统:Windows 2000 Server<br>数据库版本:SQL 2000 Server sp4 个人版</p> <p>客户端<span id="more-401"></span><br>机器名称:Zlp (dandan)<br>操作系统:Windows XP<br>数据库版本:SQL 2000 Server sp4 个人版 </p> <p><strong>2:建用户帐号</strong><br>在服务器端建立用户帐号<br>我的电脑管理-&gt;本地用户和组-&gt;用户-&gt;建立<br>UserName:zlp<br>UserPwd:zlp</p> <p><strong>3:重新启动服务器MSSQLServer</strong><br>我的电脑-&gt;控制面版-&gt;管理工具-&gt;服务-&gt;MSSQLServer 服务<br>(更改为:用户帐号,我们新建的zlp用户 .\zlp,密码:zlp)</p> <p><strong>4:安装分发服务器</strong></p> <p>A:配置分发服务器<br>工具-&gt;复制-&gt;配置发布、订阅服务器和分发-&gt;下一步-&gt;下一步(所有的均采用默认配置)</p> <p>B:配置发布服务器<br>工具-&gt;复制-&gt;创建和管理发布-&gt;选择要发布的数据库(SZ)-&gt;下一步-&gt;快照发布-&gt;下一步-&gt;<br>选择要发布的内容-&gt;下一步-&gt;下一步-&gt;下一步-&gt;完成</p> <p>C:强制配置订阅服务器(推模式,拉模式与此雷同)<br>工具-&gt;复制-&gt;配置发布、订阅服务器和分发-&gt;订阅服务器-&gt;新建-&gt;SQL Server数据库-&gt;输入客户端服务器名称(ZLP)-&gt;使用SQL Server 身份验证(sa,空密码)-&gt;确定-&gt;应用-&gt;确定</p> <p>D:初始化订阅<br>复制监视器-&gt;发布服务器(ZEHUADB)-&gt;双击订阅-&gt;强制新建-&gt;下一步-&gt;选择启用的订阅服务器-&gt;ZLP-&gt;<br>下一步-&gt;下一步-&gt;下一步-&gt;下一步-&gt;完成</p> <p><strong>5:测试配置是否成功</strong><br>复制监视器-&gt;发布服务器(ZEHUADB)-&gt;双击SZ:SZ-&gt;点状态-&gt;点立即运行代理程序<br>查看:<br>复制监视器-&gt;发布服务器(ZEHUADB)-&gt;SZ:SZ-&gt;选择ZLP:SZ(类型强制)-&gt;鼠标右键-&gt;启动同步处理<br>如果没有错误标志(红色叉),恭喜您配置成功</p> <p><strong>6:测试数据</strong><br>在服务器执行:<br>选择一个表,执行如下SQL<br>insert into WQ_NEWSGROUP_S select ”测试成功”,5</p> <p>复制监视器-&gt;发布服务器(ZEHUADB)-&gt;SZ:SZ-&gt;快照-&gt;启动代理程序<br>-&gt;ZLP:SZ(强制)-&gt;启动同步处理</p> <p>去查看同步的 WQ_NEWSGROUP_S 是否插入了一条新的记录</p>

    Read more +
  • 13

    2019-04
    my.cnf文件:my.cnf参数配置

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">my.cnf参数配置优化详解。</font> </td> </tr></tbody></table> <p><span style="COLOR: rgb(255,0,0)">PS:本配置文件针对Dell R710,双至强E5620、16G内存的硬件配置。CentOS 5.6 64位系统,MySQL 5.5.x 稳定版。适用于日IP 50-100w,PV 100-300w的站点,主要使用InnoDB存储引擎。其他应用环境请根据实际情况来设置优化。</span></p> <p># 以下选项会被MySQL客户端应用读取。<br># 注意只有MySQL附带的客户端应用程序保证可以读取这段内容。<br># 如果你想你自己的MySQL应用程序获取这些值。<br># 需要在MySQL客户端库初始化的时候指定这些选项。</p> <p>#<br>[client]<br>#password = [your_password]<br>port = @MYSQL_TCP_PORT@<br>socket = @MYSQL_UNIX_ADDR@</p> <p># *** 应用定制选项 ***</p> <p>#<br># MySQL 服务端<br>#<br>[mysqld]</p> <p># 一般配置选项<br>port = @MYSQL_TCP_PORT@<br>socket = @MYSQL_UNIX_ADDR@</p> <p># back_log 是操作系统在监听队列中所能保持的连接数,<br># 队列保存了在MySQL连接管理器线程处理之前的连接.<br># 如果你有非常高的连接率并且出现”connection refused” 报错,<br># 你就应该增加此处的值.<br># 检查你的操作系统文档来获取这个变量的最大值.<br># 如果将back_log设定到比你操作系统限制更高的值,将会没有效果<br>back_log = 300</p> <p># 不在TCP/IP端口上进行监听.<br># 如果所有的进程都是在同一台服务器连接到本地的mysqld,<br># 这样设置将是增强安全的方法<br># 所有mysqld的连接都是通过Unix sockets 或者命名管道进行的.<br># 注意在windows下如果没有打开命名管道选项而只是用此项<br># (通过 “enable-named-pipe” 选项) 将会导致mysql服务没有任何作用!<br>#skip-networking</p> <p># MySQL 服务所允许的同时会话数的上限<br># 其中一个连接将被SUPER权限保留作为管理员登录.<br># 即便已经达到了连接数的上限.<br>max_connections = 3000<br># 每个客户端连接最大的错误允许数量,如果达到了此限制.<br># 这个客户端将会被MySQL服务阻止直到执行了”FLUSH HOSTS” 或者服务重启<br># 非法的密码以及其他在链接时的错误会增加此值.<br># 查看 “Aborted_connects” 状态来获取全局计数器.<br>max_connect_errors = 30</p> <p># 所有线程所打开表的数量.<br># 增加此值就增加了mysqld所需要的文件描述符的数量<br># 这样你需要确认在[mysqld_safe]中 “open-files-limit” 变量设置打开文件数量允许至少4096<br>table_cache = 4096</p> <p># 允许外部文件级别的锁. 打开文件锁会对性能造成负面影响<br># 所以只有在你在同样的文件上运行多个数据库实例时才使用此选项(注意仍会有其他约束!)<br># 或者你在文件层面上使用了其他一些软件依赖来锁定MyISAM表<br>#external-locking</p> <p># 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB字段一起工作时相当必要)<br># 每个连接独立的大小.大小动态增加<br>max_allowed_packet = 32M</p> <p># 在一个事务中binlog为了记录SQL状态所持有的cache大小<br># 如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能.<br># 所有从事务来的状态都将被缓冲在binlog缓冲中然后在提交后一次性写入到binlog中<br># 如果事务比此值大, 会使用磁盘上的临时文件来替代.<br># 此缓冲在每个连接的事务第一次更新状态时被创建<br>binlog_cache_size = 4M</p> <p># 独立的内存表所允许的最大容量.<br># 此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源.<br>max_heap_table_size = 128M</p> <p># 排序缓冲被用来处理类似ORDER BY以及GROUP BY队列所引起的排序<br># 如果排序后的数据无法放入排序缓冲,<br># 一个用来替代的基于磁盘的合并分类会被使用<br># 查看 “Sort_merge_passes” 状态变量.<br># 在排序发生时由每个线程分配<br>sort_buffer_size = 16M</p> <p># 此缓冲被使用来优化全联合(full JOINs 不带索引的联合).<br># 类似的联合在极大多数情况下有非常糟糕的性能表现,<br># 但是将此值设大能够减轻性能影响.<br># 通过 “Select_full_join” 状态变量查看全联合的数量<br># 当全联合发生时,在每个线程中分配<br>join_buffer_size = 16M</p> <p># 我们在cache中保留多少线程用于重用<br># 当一个客户端断开连接后,如果cache中的线程还少于thread_cache_size,<br># 则客户端线程被放入cache中.<br># 这可以在你需要大量新连接的时候极大的减少线程创建的开销<br># (一般来说如果你有好的线程模型的话,这不会有明显的性能提升.)<br>thread_cache_size = 16</p> <p># 此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量.<br># 此值只对于支持 thread_concurrency() 函数的系统有意义( 例如Sun Solaris).<br># 你可可以尝试使用 [CPU数量]*(2..4) 来作为thread_concurrency的值<br>thread_concurrency = 8</p> <p># 查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果.<br># 打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表.<br># 查看 “Qcache_lowmem_prunes” 状态变量来检查是否当前值对于你的负载来说是否足够高.<br># 注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同,<br># 查询缓冲也许引起性能下降而不是性能提升.<br>query_cache_size = 128M</p> <p># 只有小于此设定值的结果才会被缓冲<br># 此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖.<br>query_cache_limit = 4M</p> <p># 被全文检索索引的最小的字长.<br># 你也许希望减少它,如果你需要搜索更短字的时候.<br># 注意在你修改此值之后,<br># 你需要重建你的 FULLTEXT 索引<br>ft_min_word_len = 8</p> <p># 如果你的系统支持 memlock() 函数,你也许希望打开此选项用以让运行中的mysql在在内存高度紧张的时候,数据在内存中保持锁定并且防止可能被swapping out<br># 此选项对于性能有益<br>#memlock</p> <p># 当创建新表时作为默认使用的表类型,<br># 如果在创建表示没有特别执行表类型,将会使用此值<br>default_table_type = MYISAM</p> <p># 线程使用的堆大小. 此容量的内存在每次连接时被预留.<br># MySQL 本身常不会需要超过64K的内存<br># 如果你使用你自己的需要大量堆的UDF函数<br># 或者你的操作系统对于某些操作需要更多的堆,<br># 你也许需要将其设置的更高一点.<br>thread_stack = 512K</p> <p># 设定默认的事务隔离级别.可用的级别如下:<br># READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE<br>transaction_isolation = REPEATABLE-READ</p> <p># 内部(内存中)临时表的最大大小<br># 如果一个表增长到比此值更大,将会自动转换为基于磁盘的表.<br># 此限制是针对单个表的,而不是总和.<br>tmp_table_size = 128M</p> <p># 打开二进制日志功能.<br># 在复制(replication)配置中,作为MASTER主服务器必须打开此项<br># 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志.<br>log-bin=mysql-bin</p> <p># 如果你在使用链式从服务器结构的复制模式 (A-&gt;B-&gt;C),<br># 你需要在服务器B上打开此项.<br># 此选项打开在从线程上重做过的更新的日志,<br># 并将其写入从服务器的二进制日志.<br>#log_slave_updates</p> <p># 打开全查询日志. 所有的由服务器接收到的查询 (甚至对于一个错误语法的查询)<br># 都会被记录下来. 这对于调试非常有用, 在生产环境中常常关闭此项.<br>#log</p> <p># 将警告打印输出到错误log文件. 如果你对于MySQL有任何问题<br># 你应该打开警告log并且仔细审查错误日志,查出可能的原因.<br>#log_warnings</p> <p># 记录慢速查询. 慢速查询是指消耗了比 “long_query_time” 定义的更多时间的查询.<br># 如果 log_long_format 被打开,那些没有使用索引的查询也会被记录.<br># 如果你经常增加新查询到已有的系统内的话. 一般来说这是一个好主意,<br>log_slow_queries</p> <p># 所有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询.<br># 不要在这里使用”1″, 否则会导致所有的查询,甚至非常快的查询页被记录下来(由于MySQL 目前时间的精确度只能达到秒的级别).<br>long_query_time = 6</p> <p># 在慢速日志中记录更多的信息.<br># 一般此项最好打开.<br># 打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里<br>log_long_format</p> <p># 此目录被MySQL用来保存临时文件.例如,<br># 它被用来处理基于磁盘的大型排序,和内部排序一样.<br># 以及简单的临时表.<br># 如果你不创建非常大的临时文件,将其放置到 swapfs/tmpfs 文件系统上也许比较好<br># 另一种选择是你也可以将其放置在独立的磁盘上.<br># 你可以使用”;”来放置多个路径<br># 他们会按照roud-robin方法被轮询使用.<br>#tmpdir = /tmp</p> <p># *** 主从复制相关的设置</p> <p># 唯一的服务辨识号,数值位于 1 到 2^32-1之间.<br># 此值在master和slave上都需要设置.<br># 如果 “master-host” 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master生效.<br>server-id = 1</p> <p># 复制的Slave (去掉master段的注释来使其生效)<br>#<br># 为了配置此主机作为复制的slave服务器,你可以选择两种方法:<br>#<br># 1) 使用 CHANGE MASTER TO 命令 (在我们的手册中有完整描述) -<br># 语法如下:<br>#<br># CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,<br># MASTER_USER=, MASTER_PASSWORD= ;<br>#<br># 你需要替换掉 , , 等被尖括号包围的字段以及使用master的端口号替换 (默认3306).<br>#<br># 例子:<br>#<br># CHANGE MASTER TO MASTER_HOST=’125.564.12.1′, MASTER_PORT=3306,<br># MASTER_USER=’joe’, MASTER_PASSWORD=’secret’;<br>#<br># 或者<br>#<br># 2) 设置以下的变量. 不论如何, 在你选择这种方法的情况下, 然后第一次启动复制(甚至不成功的情况下,<br># 例如如果你输入错密码在master-password字段并且slave无法连接),<br># slave会创建一个 master.info 文件,并且之后任何对于包含在此文件内的参数的变化都会被忽略<br># 并且由 master.info 文件内的内容覆盖, 除非你关闭slave服务, 删除 master.info 并且重启slave 服务.<br># 由于这个原因,你也许不想碰一下的配置(注释掉的) 并且使用 CHANGE MASTER TO (查看上面) 来代替<br>#<br># 所需要的唯一id号位于 2 和 2^32 &#8211; 1之间<br># (并且和master不同)<br># 如果master-host被设置了.则默认值是2<br># 但是如果省略,则不会生效<br>#server-id = 2<br>#<br># 复制结构中的master &#8211; 必须<br>#master-host =<br>#<br># 当连接到master上时slave所用来认证的用户名 &#8211; 必须<br>#master-user =<br>#<br># 当连接到master上时slave所用来认证的密码 &#8211; 必须<br>#master-password =<br>#<br># master监听的端口.<br># 可选 &#8211; 默认是3306<br>#master-port =</p> <p># 使得slave只读.只有用户拥有SUPER权限和在上面的slave线程能够修改数据.<br># 你可以使用此项去保证没有应用程序会意外的修改slave而不是master上的数据<br>#read_only</p> <p>#*** MyISAM 相关选项</p> <p># 关键词缓冲的大小, 一般用来缓冲MyISAM表的索引块.<br># 不要将其设置大于你可用内存的30%,<br># 因为一部分内存同样被OS用来缓冲行数据<br># 甚至在你并不使用MyISAM 表的情况下, 你也需要仍旧设置起 8-64M 内存由于它同样会被内部临时磁盘表使用.<br>key_buffer_size = 128M</p> <p># 用来做MyISAM表全表扫描的缓冲大小.<br># 当全表扫描需要时,在对应线程中分配.<br>read_buffer_size = 8M</p> <p># 当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道.<br># 如果你增高此值,可以提高很多ORDER BY的性能.<br># 当需要时由每个线程分配<br>read_rnd_buffer_size = 64M</p> <p># MyISAM 使用特殊的类似树的cache来使得突发插入<br># (这些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATA<br># INFILE) 更快. 此变量限制每个进程中缓冲树的字节数.<br># 设置为 0 会关闭此优化.<br># 为了最优化不要将此值设置大于 “key_buffer_size”.<br># 当突发插入被检测到时此缓冲将被分配.<br>bulk_insert_buffer_size = 256M</p> <p># 此缓冲当MySQL需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到一个空表中引起重建索引时被分配.<br># 这在每个线程中被分配.所以在设置大值时需要小心.<br>myisam_sort_buffer_size = 256M</p> <p># MySQL重建索引时所允许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).<br># 如果文件大小比此值更大,索引会通过键值缓冲创建(更慢)<br>myisam_max_sort_file_size = 10G</p> <p># 如果被用来更快的索引创建索引所使用临时文件大于制定的值,那就使用键值缓冲方法.<br># 这主要用来强制在大表中长字串键去使用慢速的键值缓冲方法来创建索引.<br>myisam_max_extra_sort_file_size = 10G</p> <p># 如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们.<br># 这对于拥有多个CPU以及大量内存情况的用户,是一个很好的选择.<br>myisam_repair_threads = 1</p> <p># 自动检查和修复没有适当关闭的 MyISAM 表.<br>myisam_recover</p> <p># 默认关闭 Federated<br>skip-federated</p> <p># *** BDB 相关选项 ***</p> <p># 如果你运行的MySQL服务有BDB支持但是你不准备使用的时候使用此选项. 这会节省内存并且可能加速一些事.<br>skip-bdb</p> <p># *** INNODB 相关选项 ***</p> <p># 如果你的MySQL服务包含InnoDB支持但是并不打算使用的话,<br># 使用此选项会节省内存以及磁盘空间,并且加速某些部分<br>#skip-innodb</p> <p># 附加的内存池被InnoDB用来保存 metadata 信息<br># 如果InnoDB为此目的需要更多的内存,它会开始从OS这里申请内存.<br># 由于这个操作在大多数现代操作系统上已经足够快, 你一般不需要修改此值.<br># SHOW INNODB STATUS 命令会显示当先使用的数量.<br>innodb_additional_mem_pool_size = 64M</p> <p># InnoDB使用一个缓冲池来保存索引和原始数据, 不像 MyISAM.<br># 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少.<br># 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80%<br># 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸.<br># 注意在32位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制,<br># 所以不要设置的太高.<br>innodb_buffer_pool_size = 6G</p> <p># InnoDB 将数据保存在一个或者多个数据文件中成为表空间.<br># 如果你只有单个逻辑驱动保存你的数据,一个单个的自增文件就足够好了.<br># 其他情况下.每个设备一个文件一般都是个好的选择.<br># 你也可以配置InnoDB来使用裸盘分区 &#8211; 请参考手册来获取更多相关内容<br>innodb_data_file_path = ibdata1:10M:autoextend</p> <p># 设置此选项如果你希望InnoDB表空间文件被保存在其他分区.<br># 默认保存在MySQL的datadir中.<br>#innodb_data_home_dir =</p> <p># 用来同步IO操作的IO线程的数量. This value is<br># 此值在Unix下被硬编码为4,但是在Windows磁盘I/O可能在一个大数值下表现的更好.<br>innodb_file_io_threads = 4</p> <p># 如果你发现InnoDB表空间损坏, 设置此值为一个非零值可能帮助你导出你的表.<br># 从1开始并且增加此值知道你能够成功的导出表.<br>#innodb_force_recovery=1</p> <p># 在InnoDb核心内的允许线程数量.<br># 最优值依赖于应用程序,硬件以及操作系统的调度方式.<br># 过高的值可能导致线程的互斥颠簸.<br>innodb_thread_concurrency = 16</p> <p># 如果设置为1 ,InnoDB会在每次提交后刷新(fsync)事务日志到磁盘上,<br># 这提供了完整的ACID行为.<br># 如果你愿意对事务安全折衷, 并且你正在运行一个小的食物, 你可以设置此值到0或者2来减少由事务日志引起的磁盘I/O<br># 0代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘.<br># 2代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上.<br>innodb_flush_log_at_trx_commit = 2<br>(<strong>说明:如果是游戏服务器,建议此值设置为2;如果是对数据安全要求极高的应用,建议设置为1;设置为0性能最高,但如果发生故障,数据可能会有丢失的危险!默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统挂了时才可能丢数据。</strong>)</p> <p># 加速InnoDB的关闭. 这会阻止InnoDB在关闭时做全清除以及插入缓冲合并.<br># 这可能极大增加关机时间, 但是取而代之的是InnoDB可能在下次启动时做这些操作.<br>#innodb_fast_shutdown</p> <p># 用来缓冲日志数据的缓冲区的大小.<br># 当此值快满时, InnoDB将必须刷新数据到磁盘上.<br># 由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言)</p> <p>innodb_log_buffer_size = 16M</p> <p># 在日志组中每个日志文件的大小.<br># 你应该设置日志文件总合大小到你缓冲池大小的25%~100%<br># 来避免在日志文件覆写上不必要的缓冲池刷新行为.<br># 不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间.<br>innodb_log_file_size = 512M</p> <p># 在日志组中的文件总数.<br># 通常来说2~3是比较好的.<br>innodb_log_files_in_group = 3</p> <p># InnoDB的日志文件所在位置. 默认是MySQL的datadir.<br># 你可以将其指定到一个独立的硬盘上或者一个RAID1卷上来提高其性能<br>#innodb_log_group_home_dir</p> <p># 在InnoDB缓冲池中最大允许的脏页面的比例.<br># 如果达到限额, InnoDB会开始刷新他们防止他们妨碍到干净数据页面.<br># 这是一个软限制,不被保证绝对执行.<br>innodb_max_dirty_pages_pct = 90</p> <p># InnoDB用来刷新日志的方法.<br># 表空间总是使用双重写入刷新方法<br># 默认值是 “fdatasync”, 另一个是 “O_DSYNC”.<br>#innodb_flush_method=O_DSYNC</p> <p># 在被回滚前,一个InnoDB的事务应该等待一个锁被批准多久.<br># InnoDB在其拥有的锁表中自动检测事务死锁并且回滚事务.<br># 如果你使用 LOCK TABLES 指令, 或者在同样事务中使用除了InnoDB以外的其他事务安全的存储引擎<br># 那么一个死锁可能发生而InnoDB无法注意到.<br># 这种情况下这个timeout值对于解决这种问题就非常有帮助.<br>innodb_lock_wait_timeout = 120</p> <p>[mysqldump]<br># 不要在将内存中的整个结果写入磁盘之前缓存. 在导出非常巨大的表时需要此项<br>quick</p> <p>max_allowed_packet = 32M</p> <p>[mysql]<br>no-auto-rehash</p> <p># 仅仅允许使用键值的 UPDATEs 和 DELETEs .<br>#safe-updates</p> <p>[isamchk]<br>key_buffer = 2048M<br>sort_buffer_size = 2048M<br>read_buffer = 32M<br>write_buffer = 32M</p> <p>[myisamchk]<br>key_buffer = 2048M<br>sort_buffer_size = 2048M<br>read_buffer = 32M<br>write_buffer = 32M</p> <p>[mysqlhotcopy]<br>interactive-timeout</p> <p>[mysqld_safe]<br># 增加每个进程的可打开文件数量.<br># 警告: 确认你已经将全系统限制设定的足够高!<br># 打开大量表需要将此值设大<br>open-files-limit = 8192<br></p>

    Read more +
  • 13

    2019-04
    mysql字符串比较函数:concat和regexp

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">mysql字符串比较函数regexp 以及concat。</font> </td> </tr></tbody></table> <p>问题描述<br><br>比如table1中有两条记录<br>name no<br>a 2,9<br>b 8,10<br><br>然后有一串字符串,是0,1,2,3,4<br><br>然后通过一条sql,找出no为2,9的记录来```<br><br>因为字符串中有2,数据中也有2<br><br>详细解释<br>------------------------------<br>表的字段就是<br>name no <br>a 2,9 <br>b 8,10 <br>字符串是str="0,1,2,3,4"<br>接下来就是查 no字段里跟str里有交集的记录<br>查询的结果就是name=a的,no=2,9的记录。</p> <div> <div id="highlighter_767606" class="syntaxhighlighter js ie"> <table border="0" cellspacing="0" cellpadding="0"><tbody><tr> <td class="gutter"> <div class="line number1 index0 alt2">1</div> <div class="line number2 index1 alt1">2</div> </td> <td class="code"> <div class="container"> <div class="line number1 index0 alt2"><code class="js plain"><font face="NSimsun">select * from table1 where </font></code></div> <div class="line number2 index1 alt1"><font face="NSimsun"><code class="js plain">concat(</code><code class="js string">','</code><code class="js plain">,no,</code><code class="js string">','</code><code class="js plain">) regexp concat(</code><code class="js string">',0,|,1,|,2,|,3,|,4,'</code><code class="js plain">);</code></font></div> </div> </td> </tr></tbody></table> </div> </div> <p>或者:</p> <div> <div id="highlighter_735685" class="syntaxhighlighter js ie"> <table border="0" cellspacing="0" cellpadding="0"><tbody><tr> <td class="gutter"> <div class="line number1 index0 alt2">1</div> <div class="line number2 index1 alt1">2</div> </td> <td class="code"> <div class="container"> <div class="line number1 index0 alt2"><code class="js plain"><font face="NSimsun">select * from table1 where </font></code></div> <div class="line number2 index1 alt1"><font face="NSimsun"><code class="js plain">concat(</code><code class="js string">','</code><code class="js plain">,no,</code><code class="js string">','</code><code class="js plain">) regexp concat(</code><code class="js string">',('</code><code class="js plain">,replace(</code><code class="js string">'0,1,2,3,4'</code><code class="js plain">,</code><code class="js string">','</code><code class="js plain">,</code><code class="js string">'|'</code><code class="js plain">),</code><code class="js string">'),'</code><code class="js plain">);</code></font></div> </div> </td> </tr></tbody></table> </div> </div> <p>由于某些原因,有时候我们没有按照范式的设计准则而把一些属性放到同一个字符串字段中。比如个人兴趣,有时候我们设计表为<br>create table members (uid int primary key,uname varchar(20),hobby varchar(100));<br><br><br>表中内容如下<br><br>mysql&gt; select * from members;<br>+-----+-------+---------------------------------+<br>| uid | uname | hobby |<br>+-----+-------+---------------------------------+<br>| 1 | AAAA | 音乐,电影,网络,篮球,阅读,乒乓球 |<br>| 2 | BBBB | 音乐,阅读,乒乓球,发呆,围棋,参禅 |<br>| 3 | CCCC | 交友,乒乓球 |<br>| 4 | DDDD | 台球,网络,看书,旅游 |<br>| 5 | EEEE | 音乐,发呆,下围棋,参禅 |<br>+-----+-------+---------------------------------+<br>4 rows in set (0.00 sec)<br><br>如果我们现在想查找一个与某个用户X (阅读,交友,围棋,足球,滑雪)有着相同爱好的会员记录 如果来操作呢? <br><br>在其它数据库中,我们能只通过程序来或者存储过程来分解这个 "阅读,交友,围棋,足球,滑雪" 字符串为单独的爱好项目,然后一个一个进行 like '%xxxx%' 来查询。 但在MySQL中我们可以直接利用这个regexp正规表达式 来构造SQL语句来实现。<br><br>首先我们把 '阅读,交友,围棋,足球,滑雪' 转换成为正则式 为 '阅读|交友|围棋|足球|滑雪' , | 在正则表达式中为 '或' 的意思<br><br>mysql&gt; select replace('阅读,交友,围棋,足球,滑雪',',','|');<br>+---------------------------------------------+<br>| replace('阅读,交友,围棋,足球,滑雪',',','|') |<br>+---------------------------------------------+<br>| 阅读|交友|围棋|足球|滑雪 |<br>+---------------------------------------------+<br>1 row in set (0.00 sec)<br><br>这样我们可以用SQL语句如下。<br>mysql&gt; select * from members where hobby regexp replace('阅读,交友,围棋,足球,滑雪',',','|');<br>+-----+-------+---------------------------------+<br>| uid | uname | hobby |<br>+-----+-------+---------------------------------+<br>| 1 | AAAA | 音乐,电影,网络,篮球,阅读,乒乓球 |<br>| 2 | BBBB | 音乐,阅读,乒乓球,发呆,围棋,参禅 |<br>| 3 | CCCC | 交友,乒乓球 |<br>| 5 | EEEE | 音乐,发呆,下围棋,参禅 |<br>+-----+-------+---------------------------------+<br>3 rows in set (0.00 sec)<br><br><br>如上语句我们可以通过一句SQL得到所有hobby包含 '阅读,交友,围棋,足球,滑雪' 任一项的记录。<br><br>但上述的语句中还有一点小的缺陷,那就是把 '下围棋' 这一条也选择了出来,如果精确匹配的话这条记录不应该被选中。为了避免这种情况,我们对SQL语句做如下改进。<br><br><br>把正则式改为 ',(阅读|交友|围棋|足球|滑雪),' 也就是要求匹配项前后必须有一个界定符","<br><br>mysql&gt; select concat(',(',replace('阅读,交友,围棋,足球,滑雪',',','|'),'),');<br>+---------------------------------------------------------------+<br>| concat(',(',replace('阅读,交友,围棋,足球,滑雪',',','|'),'),') |<br>+---------------------------------------------------------------+<br>| ,(阅读|交友|围棋|足球|滑雪), |<br>+---------------------------------------------------------------+<br>1 row in set (0.00 sec)<br><br>mysql&gt; select * from members<br>-&gt; where concat(',',hobby,',') regexp<br>-&gt; concat(',(',replace('阅读,交友,围棋,足球,滑雪',',','|'),'),');<br>+-----+-------+---------------------------------+<br>| uid | uname | hobby |<br>+-----+-------+---------------------------------+<br>| 1 | AAAA | 音乐,电影,网络,篮球,阅读,乒乓球 |<br>| 2 | BBBB | 音乐,阅读,乒乓球,发呆,围棋,参禅 |<br>| 3 | CCCC | 交友,乒乓球 |<br>+-----+-------+---------------------------------+<br>3 rows in set (0.00 sec)<br><br>这样避免了第5条记录被选中。<br><br>当然也可以利用这种正则式 ',阅读,|,交友,|,围棋,|,足球,|,滑雪,', 但效率显然不如 ',(阅读|交友|围棋|足球|滑雪),' 这种了。<br></p>

    Read more +
  • 13

    2019-04
    MYSQL模式匹配:REGEXP和like用法

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">like要求整个数据都要匹配,而REGEXP只需要部分匹配即可。</font> </td> </tr></tbody></table> <p>like要求整个数据都要匹配,而REGEXP只需要部分匹配即可。 <br>也就是说,用Like,必须这个字段的所有内容满足条件,而REGEXP只需要有任何一个片段满足即可。</p> <p>MySQL提供标准的SQL模式匹配(like),以及一种基于象Unix实用程序如vi、grep和sed的扩展正则表达式模式匹配的格式(regexp)。<br>SQL的模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零个字符)。在 MySQL中,SQL的模式缺省是忽略大小写的。下面显示一些例子。注意在你使用SQL模式时,你不能使用=或!=;而使用LIKE或NOT LIKE比较操作符。</p> <p>为了找出以“b”开头的名字:<br>mysql&gt; SELECT * FROM pet WHERE name LIKE "b%";<br>+--------+--------+---------+------+------------+------------+<br>| name | owner | species | sex | birth | death |<br>+--------+--------+---------+------+------------+------------+<br>| Buffy | Harold | dog | f | 1989-05-13 | NULL |<br>| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |<br>+--------+--------+---------+------+------------+------------+<br>为了找出以“fy”结尾的名字:<br>mysql&gt; SELECT * FROM pet WHERE name LIKE "%fy";<br>+--------+--------+---------+------+------------+-------+<br>| name | owner | species | sex | birth | death |<br>+--------+--------+---------+------+------------+-------+<br>| Fluffy | Harold | cat | f | 1993-02-04 | NULL |<br>| Buffy | Harold | dog | f | 1989-05-13 | NULL |<br>+--------+--------+---------+------+------------+-------+<br>为了找出包含一个“w”的名字:<br>mysql&gt; SELECT * FROM pet WHERE name LIKE "%w%";<br>+----------+-------+---------+------+------------+------------+<br>| name | owner | species | sex | birth | death |<br>+----------+-------+---------+------+------------+------------+<br>| Claws | Gwen | cat | m | 1994-03-17 | NULL |<br>| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |<br>| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |<br>+----------+-------+---------+------+------------+------------+<br>为了找出包含正好5个字符的名字,使用“_”模式字符:<br>mysql&gt; SELECT * FROM pet WHERE name LIKE "_____";<br>+-------+--------+---------+------+------------+-------+<br>| name | owner | species | sex | birth | death |<br>+-------+--------+---------+------+------------+-------+<br>| Claws | Gwen | cat | m | 1994-03-17 | NULL |<br>| Buffy | Harold | dog | f | 1989-05-13 | NULL |<br>+-------+--------+---------+------+------------+-------+<br><br>另外一种匹配是基于正则表达式的。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。</p> <p>“.”匹配任何单个的字符。<br>一个字符类“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的一个范围,使用一个“-”。“[a-z]”匹配任何小写字母,而“[0-9]”匹配任何数字。<br>“ * ”匹配零个或多个在它前面的东西。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配的任何数量的数字,而“.*”匹配任何数量的任何东西。<br>正则表达式是区分大小写的,但是如果你希望,你能使用一个字符类匹配两种写法。例如,“[aA]”匹配小写或大写的“a”而“[a-zA-Z]”匹配两种写法的任何字母。<br>如果它出现在被测试值的任何地方,模式就匹配(只要他们匹配整个值,SQL模式匹配)。<br>为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。<br>为了说明扩展正则表达式如何工作,上面所示的LIKE查询在下面使用REGEXP重写:<br>为了找出以“b”开头的名字,使用“^”匹配名字的开始并且“[bB]”匹配小写或大写的“b”:<br>mysql&gt; SELECT * FROM pet WHERE name REGEXP "^[bB]";<br>+--------+--------+---------+------+------------+------------+<br>| name | owner | species | sex | birth | death |<br>+--------+--------+---------+------+------------+------------+<br>| Buffy | Harold | dog | f | 1989-05-13 | NULL |<br>| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |<br>+--------+--------+---------+------+------------+------------+<br>为了找出以“fy”结尾的名字,使用“$”匹配名字的结尾:<br>mysql&gt; SELECT * FROM pet WHERE name REGEXP "fy$";<br>+--------+--------+---------+------+------------+-------+<br>| name | owner | species | sex | birth | death |<br>+--------+--------+---------+------+------------+-------+<br>| Fluffy | Harold | cat | f | 1993-02-04 | NULL |<br>| Buffy | Harold | dog | f | 1989-05-13 | NULL |<br>+--------+--------+---------+------+------------+-------+<br>为了找出包含一个“w”的名字,使用“[wW]”匹配小写或大写的“w”:<br>mysql&gt; SELECT * FROM pet WHERE name REGEXP "[wW]";<br>+----------+-------+---------+------+------------+------------+<br>| name | owner | species | sex | birth | death |<br>+----------+-------+---------+------+------------+------------+<br>| Claws | Gwen | cat | m | 1994-03-17 | NULL |<br>| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |<br>| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |<br>+----------+-------+---------+------+------------+------------+<br></p>

    Read more +
  • 13

    2019-04
    MYSQL学习:varchar最大长度限制规则

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">MySQL中varchar最大长度是多少?</font> </td> </tr></tbody></table> <p><span style="FONT-SIZE: 12pt" lang="zh-CN">这不是一个固定的数字。本文简要说明一下限制规则。</span></p> <p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 7pt" dir="ltr"><span style="COLOR: rgb(0,0,0); FONT-SIZE: 12pt" lang="zh-CN">strlen 计算字符串长度,一个中文当2字符</span></p> <p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 7pt" dir="ltr"><span style="COLOR: rgb(0,0,0); FONT-SIZE: 12pt" lang="zh-CN">mb_strlen根据它的字符编码模式,统计字符quot</span></p> <p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 7pt" dir="ltr"><span style="COLOR: rgb(0,0,0); FONT-SIZE: 12pt" lang="zh-CN">count计算数组中的元素数目或对象中的属性个数</span></p> <p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 3pt" dir="ltr" class="()"><span style="COLOR: rgb(128,128,128); FONT-SIZE: 10pt" lang="zh-CN">&lt;?php<br>header('Content-Type:text/html;charset=UTF-8');<br>$string1="谢春业";//定义中文字符变量<br>$string2="xcy";//定义英文字符变量<br>//直接输出看看他们的长度<br>echo strlen($string1);<br>echo "&lt;/br&gt;";<br>echo strlen($string2);<br>echo "&lt;/br&gt;";</span></p> <p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 3pt" dir="ltr" class="()"><span style="COLOR: rgb(128,128,128); FONT-SIZE: 10pt" lang="zh-CN">//用 php 多字节扩展函数 mb_strlen试试看<br>echo mb_strlen($string1,'utf8');<br>echo "&lt;/br&gt;";<br>echo mb_strlen($string2,'utf8');<br>echo "&lt;/br&gt;";</span></p> <p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 3pt" dir="ltr" class="()"><span style="COLOR: rgb(128,128,128); FONT-SIZE: 10pt" lang="zh-CN"></span><span style='FONT-FAMILY: "times new roman"; COLOR: rgb(128,128,128); FONT-SIZE: 10pt' lang="-none-"></span><span style="COLOR: rgb(128,128,128); FONT-SIZE: 10pt" lang="zh-CN">?&gt;</span></p> <p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 3pt" dir="ltr" class="()"><span style="COLOR: rgb(128,128,128); FONT-SIZE: 10pt" lang="zh-CN"></span></p> <p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 3pt" dir="ltr" class="()"><span style="COLOR: rgb(128,128,128); FONT-SIZE: 10pt" lang="zh-CN">输出结果是:</span></p> <p style="TEXT-ALIGN: left; MARGIN-BOTTOM: 3pt" dir="ltr" class="()"><span style="COLOR: rgb(128,128,128); FONT-SIZE: 10pt" lang="zh-CN">9<br>3<br>3<br>3</span></p> <p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">1、限制规则</span></p> <p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">字段的限制在字段定义的时候有以下规则:</span><span style="FONT-SIZE: 16px" class="Apple-style-span"> </span></p> <p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">a)</span><span style="FONT-SIZE: 7pt" lang="zh-CN"> </span><span style="FONT-SIZE: 12pt" lang="zh-CN">存储限制</span></p> <p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 16px" class="Apple-style-span">varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。</span><span style="FONT-SIZE: 16px" class="Apple-style-span"> </span></p> <p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">b)</span><span style="FONT-SIZE: 7pt" lang="zh-CN"> </span><span style="FONT-SIZE: 12pt" lang="zh-CN">编码长度限制</span></p> <p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 16px" class="Apple-style-span">字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;</span></p> <p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 16px" class="Apple-style-span">  字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。</span></p> <p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">  对于英文比较多的</span><span style="FONT-SIZE: 12pt" lang="zh-CN">论坛</span><span style="FONT-SIZE: 12pt" lang="zh-CN"> ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。</span></p> <p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 16px" class="Apple-style-span">  若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。</span><span style="FONT-SIZE: 16px" class="Apple-style-span"> </span></p> <p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">c)</span><span style="FONT-SIZE: 7pt" lang="zh-CN"> </span><span style="FONT-SIZE: 12pt" lang="zh-CN">行长度限制</span></p> <p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 16px" class="Apple-style-span">  导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示</span></p> <p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 16px" class="Apple-style-span">   ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to    change some columns to TEXT or BLOBs。</span><span style="FONT-SIZE: 16px" class="Apple-style-span"> </span></p> <p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">2、计算例子</span></p> <p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 16px" class="Apple-style-span">  举两个例说明一下实际长度的计算。</span><span style="FONT-SIZE: 16px" class="Apple-style-span"> </span></p> <p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">a)</span><span style="FONT-SIZE: 7pt" lang="zh-CN"> </span><span style="FONT-SIZE: 12pt" lang="zh-CN">若一个表只有一个varchar类型,如定义为</span></p> <p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">create table t4(c varchar(N)) charset=gbk;</span></p> <p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">则此处N的最大值为(65535-1-2)/2=</span><span lang="zh-CN">32766</span><span style="FONT-SIZE: 12pt" lang="zh-CN">。</span></p> <p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">减1的原因是实际行存储从第二个字节开始’;</span></p> <p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">减2的原因是varchar头部的2个字节表示长度;</span></p> <p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">除2的原因是字符编码是gbk。</span></p> <p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN"></span></p> <p style="TEXT-ALIGN: left; MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">b)</span><span style="FONT-SIZE: 7pt" lang="zh-CN"> </span><span style="FONT-SIZE: 12pt" lang="zh-CN">若一个表定义为</span></p> <p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;</span></p> <p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">则此处N的最大值为 (65535-1-2-4-30*3)/3=21812</span></p> <p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">减1和减2与上例相同;</span></p> <p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">减4的原因是int类型的c占4个字节;</span></p> <p style="TEXT-ALIGN: left; MARGIN-LEFT: 0.583in" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">减30*3的原因是char(30)占用90个字节,编码是utf8。</span><span style="FONT-SIZE: 16px" class="Apple-style-span"> </span></p> <p style="TEXT-ALIGN: left" dir="ltr"><span style="FONT-SIZE: 12pt" lang="zh-CN">如果被varchar超过上述的b规则,被强转成text类型,则每个字段占用定义长度为11字节,当然这已经不是“varchar”了。</span></p>

    Read more +
  • 13

    2019-04
    MYSQL备份:启用二进制日志功能的MYSQL增量备份

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">mysql增量备份.</font> </td> </tr></tbody></table> <p>小量的数据库我们可以每天进行完整备份,因为这也用不了多少时间,但当数据库很大时,我们就不太可能每天进行一次完整备份了,而且改成每周一次完整备份,每天一次增量备份类似这样的备份策略。增量备份的原理就是使用了mysql的二进制日志,所以我们必须启用二进制日志功能。</p> <p><strong>一、增量备份</strong></p> <p>1、比如我们在星期天下午11点做一次完整备份:</p> <blockquote> <p>mysqldump --single-transaction --flush-logs --master-data=2 --all-databases &gt; fullbackup_sunday_11_PM.sql</p> </blockquote> <p>在sql文件中我们会看到两行:</p> <p>&#8211; Position to start replication or point-in-time recovery from</p> <p>&#8211; CHANGE MASTER TO MASTER_LOG_FILE=’bin-log.000002′, MASTER_LOG_POS=107;</p> <p>第二行包含了我们需要的信息,是指备份后所有的更改将会保存到bin-log.000002二进制文件中。</p> <p>2、然后在星期一下午11点我们来做一次增量备份:</p> <blockquote> <p>mysqladmin flush-logs</p> </blockquote> <p>这时将会产生一个新的二进制日志文件bin-log.000003,bin-log.000002则保存了自星期天下午11点到现在的所有更改,我们只需要把这个文件备份到安全的地方就行了。然后星期二我们又做增量备份,还是执行同样的命令,这时我们保存bin-log.000003文件。</p> <p><strong>二、恢复备份</strong></p> <p>比如星期三中午12点出现了故障,这时需要恢复,我们首先导入星期天的完整备份:</p> <blockquote> <p>mysql &lt; fullbackup_sunday_3_AM.sql</p> </blockquote> <p>接着我们导入星期一和星期二的增量备份:</p> <blockquote> <p>mysqlbinlog bin-log.000002 bin-log.000003 | mysql</p> </blockquote> <p>这时我们已经恢复了所有备份数据,我们还可以找到bin-log.000004,进一步恢复最新的数据。</p>

    Read more +
  • 13

    2019-04
    Mysql C API编程:用C语言编写的Mysql编程接口

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">Mysql C语言API编程入门讲解之详细篇。</font> </td> </tr></tbody></table> <p>软件开发中我们经常要访问数据库,存取数据,之前已经有网友提出让鸡啄米讲讲数据库编程的知识,本文就详细讲解如何使用Mysql的C语言API进行数据库编程。</p> <p>API,全称Application Programming Interfaces,即应用程序编程接口,我们可以调用这些接口,执行API函数提供的功能。</p> <p>Mysql C语言API就是用C语言编写的Mysql编程接口,使用这些接口函数可以实现对Mysql数据库的查询等操作。</p> <p><strong>Mysql的安装</strong></p> <p>要进行Mysql编程首先要在充当Mysql服务器的电脑和本机上都安装Mysql,服务器上的Mysql用来连接查询,本机上的Mysql作为开发之用,当然本机也可以兼顾服务器和开发之用。下载Mysql可以到http://www.mysql.com/downloads/mysql/。鸡啄米安装的是“Windows (x86, 64-bit), MSI Installer”版本。</p> <p>在Mysql安装过程中,安装选项一定要选上Development Components下的Client C API library(shared),这样才会将Mysql API的头文件和动态库安装到电脑中。</p> <p>安装完成后,我们编程要用的就是include目录下的头文件和lib目录下的库文件。</p> <p><strong>Mysql API数据结构</strong></p> <p>Mysql API中用到了很多结构体等数据类型,下面就简单说说常用的几个数据结构的含义,至于它们的定义鸡啄米就不贴了,大家可以到Mysql提供的mysql.h头文件中查看。</p> <p><strong>MYSQL</strong></p> <p>连接数据库前,必须先创建MYSQL变量,此变量在很多Mysql API函数会用到。它包含了一些连接信息等数据。</p> <p><strong>MYSQL_RES</strong></p> <p>MYSQL_RES结构体中包含了查询结果集,也就是从数据库中查询到的数据。可以使用mysql_store_result或mysql_use_result函数获得。</p> <p><strong>MYSQL_ROW</strong></p> <p><strong>MYSQL ROW的定义如下:</strong></p> <p>typedef char **MYSQL_ROW;</p> <p>可见,它实际上是char **类型,指向一个字符串数组。可以通过mysql_fetch_row函数获得。</p> <p><strong>MYSQL_FIELD</strong></p> <p>MYSQL_FIELD中包含了字段名、字段类型和大小等信息。可以重复调用mysql_fetch_field函数获得所有字段的信息。</p> <p><strong>Mysql C API编程步骤</strong></p> <p>1、首先我们要包含mysql的头文件,并链接mysql动态库。即添加以下语句:</p> <blockquote> <p>#include &lt;WinSock2.h&gt; // 进行网络编程需要winsock2.h</p> <p>#include &lt;mysql.h&gt;</p> <p>#pragma comment(lib, “libmysql.lib”)</p> </blockquote> <p>2、创建MYSQL变量。如:</p> <p>MYSQL mysql;</p> <p>3、初始化MYSQL变量。</p> <p>mysql_init(&amp;mysql);</p> <p>4、调用mysql_real_connect函数连接Mysql数据库。mysql_real_connect函数的原型如下:</p> <blockquote> <p>MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host,const char *user,const char *passwd,const char *db,unsigned int port,const char *unix_socket,unsigned long clientflag);</p> </blockquote> <p>参数说明:mysql--前面定义的MYSQL变量;host--MYSQL服务器的地址;user--登录用户名;passwd--登录密码;db--要连接的数据库;port--MYSQL服务器的TCP服务端口;unix_socket--unix连接方式,为NULL时表示不使用socket或管道机制;clientflag--Mysql运行为ODBC数据库的标记,一般取0。连接失败时该函数返回0。</p> <p>5、调用mysql_real_query函数进行数据库查询。mysql_real_query函数的原型如下:</p> <p>int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length);</p> <p>参数说明:mysql--前面定义的MYSQL变量;q--SQL查询语句;length--查询语句的长度。</p> <p>查询成功则该函数返回0。</p> <p>6、通过调用mysql_store_result或mysql_use_result函数返回的MYSQL_RES变量获取查询结果数据。</p> <p>两个函数的原型分别为:</p> <p>MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);</p> <p>MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql);</p> <p>这两个函数分别代表了获取查询结果的两种方式。第一种,调用mysql_store_result函数将从Mysql服务器查询的所有数据都存储到客户端,然后读取;第二种,调用mysql_use_result初始化检索,以便于后面一行一行的读取结果集,而它本身并没有从服务器读取任何数据,这种方式较之第一种速度更快且所需内存更少,但它会绑定服务器,阻止其他线程更新任何表,而且必须重复执行mysql_fetch_row读取数据,直至返回NULL,否则未读取的行会在下一次查询时作为结果的一部分返回,故经常我们使用mysql_store_result。</p> <p>7、调用mysql_fetch_row函数读取结果集数据。</p> <p>上述两种方式最后都是重复调用mysql_fetch_row函数读取数据。mysql_fetch_row函数的原型如下:</p> <p>MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);</p> <p>参数result就是mysql_store_result或mysql_use_result的返回值。</p> <p>该函数返回MYSQL_ROW型的变量,即字符串数组,假设为row,则row[i]为第i个字段的值。当到结果集尾部时,此函数返回NULL。</p> <p>8、结果集用完后,调用mysql_free_result函数释放结果集,以防内存泄露。mysql_free_result函数的原型如下:</p> <p>void STDCALL mysql_free_result(MYSQL_RES *result);</p> <p>9、不再查询Mysql数据库时,调用mysql_close函数关闭数据库连接。mysql_close函数的原型为:</p> <p>void STDCALL mysql_close(MYSQL *sock);</p> <p><strong>Mysql C API编程实例</strong></p> <p>这里给大家一个简单的Mysql API编程实例。使用VS2010编写。访问的数据库为安装Mysql后默认创建的名称为“mysql”的数据库,查询其“user”表的数据,步骤如下:</p> <p>1、创建一个Win32 Console Application(Win32控制台程序)的空工程(创建空工程需要在向导的Application Settings一步中,勾选Empty project),名称就取为mysql。</p> <p>2、在Solution Explorer窗口的工程名“mysql”上点右键,选择“Properties”,弹出工程的属性页,然后在左侧子窗口中,选择Configuration Properties-&gt;VC++ Directories,右侧子窗口中会显示一些设置项列表,然后在Include Directories项中添加Mysql的Include目录,在Library Directories项中添加Mysql的lib目录。</p> <p style="TEXT-ALIGN: center"><img border="0" alt="Mysql C语言API编程入门讲解之详细篇" src="http://www.webjx.com/files/allimg/121224/1337320.gif" width="598" height="276"></p> <p>3、新建一个cpp文件,取名mysql.cpp。</p> <p>4、在mysql.cpp文件中包含mysql头文件并链接mysql动态库。</p> <blockquote> <p>#include &lt;WinSock2.h&gt;</p> <p>#include &lt;mysql.h&gt;</p> <p>#pragma comment(lib, “libmysql.lib”)</p> </blockquote> <p>这里要注意,因为mysql用到了网络连接的接口函数,所以需要在前面包含WinSock2.h文件。</p> <p>同时本例中使用了输出流cout,所以还要包含输入输出流头文件:</p> <blockquote> <p>#include &lt;iostream&gt;</p> <p>using namespace std;</p> </blockquote> <p>5、创建main函数,并修改函数体如下:</p> <blockquote> <p>int main()</p> <p>{</p> <p>MYSQL mysql;</p> <p>MYSQL_RES *res;</p> <p>MYSQL_ROW row;</p> <p>// 初始化MYSQL变量</p> <p>mysql_init(&amp;mysql);</p> <p>// 连接Mysql服务器,本例使用本机作为服务器。访问的数据库名称为“msyql”,参数中的user为你的登录用户名,***为登录密码,需要根据你的实际用户进行设置</p> <p>if (!mysql_real_connect(&amp;mysql, “127.0.0.1”, “user”, “123”, “mysql”, 3306, 0, 0))</p> <p>{</p> <p>cout &lt;&lt; “mysql_real_connect failure!” &lt;&lt; endl;</p> <p>return 0;</p> <p>}</p> <p>// 查询mysql数据库中的user表</p> <p>if (mysql_real_query(&amp;mysql, “select * from user”, (unsigned long)strlen(“select * from user”)))</p> <p>{</p> <p>cout &lt;&lt; “mysql_real_query failure!” &lt;&lt; endl;</p> <p>return 0;</p> <p>}</p> <p>// 存储结果集</p> <p>res = mysql_store_result(&amp;mysql);</p> <p>if (NULL == res)</p> <p>{</p> <p>cout &lt;&lt; “mysql_store_result failure!” &lt;&lt; endl;</p> <p>return 0;</p> <p>}</p> <p>// 重复读取行,并输出第一个字段的值,直到row为NULL</p> <p>while (row = mysql_fetch_row(res))</p> <p>{</p> <p>cout &lt;&lt; row[0] &lt;&lt; endl;</p> <p>}</p> <p>// 释放结果集</p> <p>mysql_free_result(res);</p> <p>// 关闭Mysql连接</p> <p>mysql_close(&amp;mysql);</p> <p>return 0;</p> <p>}</p> </blockquote> <p>6、将mysql安装目录中的libmysql.dll动态库文件拷贝到工程的当前目录,运行程序。</p> <p>如果你跟鸡啄米一样使用的是mysql的64位版本,此时程序会报错,有很多不能解析的符号,这是因为我们的工程是32位的,应该改为64位,方法是,上面的工程属性页的右上角有个Configuration Manager按钮,点击它弹出Configuration Manager对话框,下面的列表中可以看到有我们的工程,Platform列显示为“Win32”:</p> <p style="TEXT-ALIGN: center"><img border="0" alt="Mysql C语言API编程入门讲解之详细篇" src="http://www.webjx.com/files/allimg/121224/1337321.gif" width="519" height="357"></p> <p>这里需要点击右侧的箭头下拉,选择New弹出New Project Platform对话框,New platform选择x64创建新Platform:</p> <p style="TEXT-ALIGN: center"><img border="0" alt="Mysql C语言API编程入门讲解之详细篇" src="http://www.webjx.com/files/allimg/121224/1337322.gif" width="339" height="245"></p> <p>上述的Platform列选择x64就可以了。再次运行程序,你会发现它果然不报错了。</p> <p>本文就到这里了,到此大家应该对Mysql C API编程有了基本的了解了,在实际开发中可以不断深入研究。</p>

    Read more +
  • 17

    2018-05
    SQL Server数据转换服务小妙招

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">以下的文章主要是介绍SQL Server数据转换服务的4妙用之执行一些自动化的操作。在SQL Server数据库的实际操作管理中,数据库管理员所希望的是数据库能够自动收集信息并将信息发送到用户指定的地点如邮件等等。 在数据转换任务中,就提供了一系列类似的工具,来简化数据</font> </td> </tr></tbody></table> <p>  以下的文章主要是介绍SQL Server数据转换服务的4妙用之执行一些自动化的操作。在SQL Server<a href="http://www.webjx.com/database/"><u>数据库</u></a>的实际操作管理中,<a href="http://www.webjx.com/database/"><u>数据库</u></a>管理员所希望的是<a href="http://www.webjx.com/database/"><u>数据库</u></a>能够自动收集信息并将信息发送到用户指定的地点如邮件等等。</p> <p>  在数据转换任务中,就提供了一系列类似的工具,来简化<a href="http://www.webjx.com/database/"><u>数据库</u></a>管理员的工作。如在DTS组套种,有一个发送邮件的工具。通过相关的设置,<a href="http://www.webjx.com/database/"><u>数据库</u></a>会在包成功或者失败的时候自动发送一个电子邮件给<a href="http://www.webjx.com/database/"><u>数据库</u></a>管理员,以提醒他作业是成功还是失败。并且会附上比较详细的信息,以便于<a href="http://www.webjx.com/database/"><u>数据库</u></a>管理员进行后续的操作。</p> <p>  数据转换功能中,还包含了一个执行包任务,是的一个包运行另一个作为包步骤。这可以让我们的工作更加的自动化。如在<a href="http://www.webjx.com/database/"><u>数据库</u></a>导入过程中,我们可以通过包运行计划,把需要导入的数据表一步步按顺序写入执行包计划中。而让<a href="http://www.webjx.com/database/"><u>数据库</u></a>在比较空闲的时候,自动按序导入数据。而<a href="http://www.webjx.com/database/"><u>数据库</u></a>管理员不用在旁边指挥。</p> <p>  可见,数据转换服务是功能很强的一项服务。在数据导入与转换的过程中,笔者首推这个工具。特别是在数据量比较大的情况下,这个数据转换服务确实能够起到画龙点睛的作用。</p> <p>  以上的相关内容就是对SQL Server数据转换服务的四个妙之执行一些自动化的操作的介绍,望你能有所收获。</p> <p>  上述的相关内容就是对SQL Server数据转换服务的四个妙之执行一些自动化的操作的描述,希望会给你带来一些帮助在此方面。</p>

    Read more +
  • 17

    2018-05
    SQL Server复制功能要避开缺陷的干扰

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">SQL Server复制功能 巧妙选择避开Bug.</font> </td> </tr></tbody></table> <p><a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server具有强大的复制功能,除了将数据和数据库对象从一个数据库复制并准确分发的另一个数据库中,还要实行数据库之间的同步。<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server的复制分为三种,下面介绍一下这三种复制技术及其存在的一些缺陷,大家在使用时可以根据具体的情境选择适用的复制方法,避开这些缺陷的干扰。</p> <p>1. 快照复制</p> <p>A每隔一段时间将B中的相应表中的数据全部删除,然后将自己相应表中的全部插到B中。此种方式显然不适合我们的应用,不予考虑。</p> <p>2. 事务复制</p> <p>对A中的每一个满足复制条件的事务,每隔一定时间A都应用到B上,反之亦然。<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server 通过把数据传给三个存储过程(插入,删除,修改)进行数据的修改,我们可以根据自己的应用改写此存储过程。</p> <p>存在缺陷:如果从A到B的复制条件和从B到A复制条件相同的话,会产生“踢皮球”的循环现象。既一系列事务应用于A,A会把这些事务应用于B,B收到这一系列事务后,又会把它应用于A,……如此循环。</p> <p>3. 合并复制</p> <p>每隔一段时间,复制将会把数据库A,B中需要复制的数据合并一下,使得AB中的数据完全一样,数据都是AB数据库中数据的全体数据。如果A和B中数据主键有冲突,则根据优先级只选其中一条数据。</p> <p>需要注意:为了区分数据来自于哪个地点,<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server会将每一个需要复制的表中另加一个字段,在编程时应该注意。</p> <p>存在缺陷:</p> <p><a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server 每隔一定时间进行一次复制,如果找不到另一台Server(比如因为网络故障,或是另一台<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server没有启动),经过n(默认为10)次连接后,它的复制功能将会down掉,直至有人将复制功能启动。 需要复制的表中如果在复制之前就有数据,在建立复制时比较麻烦(<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server不提供此类问题的解决方法,需要手动完成)。因此,需要复制的表在使用过程中不能经常变动表结构。(文/张梦强)</p>

    Read more +
  • 17

    2018-05
    数据库的安全理论:如何做好数据库的安全工作

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">对数据库系统本身的安全需求:用户认证管理、访问控制、审计,数据库的稳定性,保证数据的安全性与完整性,完善的恢复功能,数据加密.</font> </td> </tr></tbody></table> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto"><strong>先分3点从全局来看</strong></p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">对操作系统的安全需求:防止对DBMS的非法访问和修改,保护存储的数据、文件的安全性,对数据库用户的认证<br>对数据库系统本身的安全需求:用户认证管理、访问控制、审计,数据库的稳定性,保证数据的安全性与完整性,完善的恢复功能,数据加密<br>对数据库应用系统的安全需求:访问控制、认证管理,对数据库的保护防止非法访问和修改,自身的稳定性</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto"><strong>举一个实例</strong></p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,这是SQL注入的标准释义。&#160;<br>所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,比如典型的攻击类型是在newsid变量后加后sql语句:exec xp_cmdshell ‘net user’<br>这样就执行了一个加用户的命令了。</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">Web应用程序访问数据库会造成特定的一些潜在安全问题。SQL注入攻击仍然稳居黑客至爱兵器榜的首位,对那些想要保护数据安全的企业来说,这是个大麻烦。<br>据CVE的2006年度统计数据显示,SQL注入攻击漏洞呈逐年上升的状态</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto"><strong>如何做好数据库的安全工作</strong></p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">1.数据库基本安全架构</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">从广义上讲,数据库的安全首先依赖于网络系统。网络系统的安全是数据库安全的第一道屏障,外部入侵首先就是从入侵网络系统开始的。</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">解决方案:防火墙,入侵检测 IDS&#8212;Instrusion Detection System,协作式入侵检测技术,IPS:Intrusion Prevention System 入侵防御系统</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">对于宿主操作系统层次,操作系统安全策略用于配置本地计算机的安全设置,包括密码策略、账户锁定策略、审核策略、IP安全策略、用户权利指派、加密数据的恢复代理以及其它安全选项。<br>2 数据库用户及权限</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">减少特权管理,不要显式地将同一特权组授权给几个用户,只需将这特权组授给角色,然后将角色授权给每一用户。<br>动态特权管理,如果一组特权需要改变,只需修改角色的特权,所有授给该角色的全部用户的安全域将自动地反映对角色所作的修改。<br>特权的选择可用性,授权给用户的角色可选择地使其使能(可用)或使不能(不可用)。<br>应用可知性,当一用户经一用户名执行应用时,该数据库应用可查询字典,将自动地选择使角色使能或不能。<br>专门的应用安全性,角色使用可由口令保护,应用可提供正确的口令使用权角色使能,达到专用的应用安全性。因用户不知其口令,不能使角色使能。<br>3 数据库加密技术</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">库外加密<br>将数据库的文件作为加密对象,在库外加密方式中,加/解密过程发生在DBMS之外,DBMS管理的是密文。加/解密过程大多在客户端实现,也有的由专门的加密服务器或硬件完成。<br>库内加密<br>加密对象为数据库中存储的数据,比如表、记录、元素、数据等。库内加密在DBMS内核层实现加密,加/解密过程对用户与应用透明,数据在物理存取之前完成加/解密工作。<br>硬件加密<br>在物理存储器与数据库系统之间的硬件加密装置,加密解密操作由硬件中间设备完成<br>4 数据库备份技术</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">数据库有三种标准的备份方法,它们分别为导出/导入(EXPORT/IMPORT)、冷备份、热备份。&#160;<br>&#160;&#160;&#160;&#160; &#8212; 导入/导出备份:逻辑备份<br>&#160;&#160;&#160;&#160; &#8212; 冷备份:物理备份<br>&#160;&#160;&#160;&#160; &#8212; 热备份:物理备份&#160;<br>设定数据库备份计划,启动数据库归档模式,定期执行数据库备份,监控检查备份情况</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">5 数据库审计技术</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">审计是对选定的用户动作的监控和记录,通常用于:<br>审查可疑的活动。例如:数据被非授权用户所删除,此时安全管理员可决定对该 数据库的所有连接进行审计,以及对数据库的所有表的成功地或不成功地删除进行审计。<br>监视和收集关于指定数据库活动的数据。例如:DBA可收集哪些被修改、执行了多少次逻辑的I/O等统计数据。</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto"><strong>数据库常见攻击与防护</strong></p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">1 破解弱口令或默认的用户名及口令</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">Oracle数据库常见缺省用户:SYS、SYSTEM、DBSNMP、SCOTT&#160;<br>数据库常见缺省用户:SA</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">2 特权提升</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">特权提升:恶意的用户占有超过其应该具有的系统特权&#160;<br>原因:<br>数据库管理系统漏洞<br>如:oracle 10g DBMS_Scheduler本地特权提升漏洞:任何拥有CREATE JOB权限可通过dbms_scheduler执行一个数据库作业而转换SESSION_USER到SYS,本地攻击者可以利用此漏洞提升权限。<br>错误的配置:一个用户被错误地授与了超过其实际需要用来完成工作的、对数据库及其相关应用程序的访问和特权。<br>3 利用未用的数据库服务和功能中的漏洞</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">利用未用的和不需要的数据库服务和功能中的漏洞<br>利用未用的和不需要的数据库服务和功能中的配置缺陷<br>4 针对未打补丁的数据库漏洞</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">虽然Oracle和其它的数据库厂商确实在为其漏洞打补丁,问题是单位不能跟得上这些补丁,因此它们总是处于企图利用某种机会的老谋深算的攻击者控制之下。<br>5 SQL注入攻击及防护</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">漏洞原理:在数据库应用的编程过程中,由于程序员没有对用户输入数据进行规范检查,导致攻击者能够通过构造恶意输入数据,操作数据库执行,甚至能直接攻击操作系统<br>SQL Injection(SQL注入),就是利用某些数据库的外部应用把特定的数据命令插入到实际的数据库操作语言当中,从而达到入侵数据库乃至操作系统的目的。</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">解决方案:</p> <p style="LINE-HEIGHT: 25px; TEXT-INDENT: 0px; MARGIN: 12px auto">从根本上避免出现SQL Injection漏洞,必须提高WEB程序员的安全意识和安全编程技能来解决程序本身的漏洞;<br>代码中必须对所有用户输入进行严格的过滤,对单引号、双引号以及“--”等符号、非指定的数据类型及数据长度进行过滤;<br>用存储过程来执行所有的查询&#160;<br>限制表单或查询字符串输入的长度&#160;<br>检查用户输入的合法性,确信输入的内容只包含合法的数据&#160;<br>将用户登录名称、密码等数据加密保存&#160;<br>检查提取数据的查询所返回的记录数量&#160;&#160;<br>合理设置数据库应用程序的权限;<br>对数据库系统进行必要的安全配置。</p>

    Read more +
  • 17

    2018-05
    管理工具SQLyogEnt:简单创建MYSQL数据库

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">MySql管理利器SQLyogEnt初识(php建立数据库).</font> </td> </tr></tbody></table> <p>如果你选择PHP进行网站建设,那你必须懂得php建立数据库,那用mysql数据就是必须的了。刚接触php的朋友也许对这个mysql数据库很陌生,但如果有一款非常好用的数据库管理工具,那是用起来就方便多了,笔者几天就向大家介绍一款mysql的管理工具SQLyogEnt,笔者是用的SQLyogEnt是英文版,目前好像没有中文版,由于功能强大,所以SQLyogEnt很受PHP用户的喜爱,接下就用实例来讲解下如何使用SQLyogEnt来建立一个简单的数据库。</p> <p>今天我建立的数据库名叫“mydb”,数据库里包含一个表“news”。接下来我们就打开SQLyogEnt实际操作一下。</p> <p>第一,打开SQLyogEnt,由于要运行mysql必须要先开启运行环境,笔者使用的php运行环境是wamp,很好使用,一键安装。</p> <p style="TEXT-ALIGN: center"><img border="0" src="http://www.webjx.com/files/allimg/120109/2318270.jpg" width="203" height="45" alt=""></p> <p>第二,打开SQLyogEnt后会首先弹出链接数据库的界面,如图,mysql hostaddress选项框填写书库的地址,默认本机就是“localhost”,user name选项框是填写数据库的管理用户名,本机默认“root”,password选项框是填写数据库的管理密码,本机默认为空,port是数据库端口,默认就可以了,最后点解“connect”按钮进行链接。</p> <p style="TEXT-ALIGN: center"><img border="0" alt="木子网页设计" src="http://www.webjx.com/files/allimg/120109/2318271.jpg" width="471" height="374"></p> <p>如果地址,用户名,密码都正确就会链接成功,在随机弹出的界面左方就是整个数据库列表,如图。</p> <p style="TEXT-ALIGN: center"><img border="0" alt="木子网页设计" src="http://www.webjx.com/files/allimg/120109/2318272.jpg" width="356" height="410"></p> <p>第三,新建一个数据库。在左侧列表的空白处单击鼠标右键,弹出的菜单中,选择“create database”,接着会弹出填写数据库名的选项框,如图,我们这里填写“mydb”,接着单击“create”按钮,“mydb”数据库就创建成功了,在左边的数据库列表里会出现“mydb”数据库。</p> <p style="TEXT-ALIGN: center"><img border="0" alt="木子网页设计" src="http://www.webjx.com/files/allimg/120109/2318273.jpg" width="543" height="367"></p> <p style="TEXT-ALIGN: center"><img border="0" alt="木子网页设计" src="http://www.webjx.com/files/allimg/120109/2318274.jpg" width="336" height="199"></p> <p>第四,在“mydb”数据库中创建“news”表,在左边菜单找到“mydb”数据库,然后在上面右击,在弹出的菜单中,选择“create table”,会弹出,创建表的界面,如图</p> <p style="TEXT-ALIGN: center"><img border="0" alt="木子网页设计" src="http://www.webjx.com/files/allimg/120109/2318275.jpg" width="433" height="354"></p> <p>第五,创建字段,首先介绍下SQLyogEnt工具创建表界面。“field”列是字段名,“datetype”是字段类型,“len”是字段长度,“PK”是否是主键,“NOT NULL”是否允许为空,“auto incr”是否自动增长(一般主键才会选择),“comment”字段 描述,好了介绍了创建界面,下面其实很简单了。大家可以看下我是这么设置“news”表的。设置完成后单击“create table”按钮,接下来会弹出设置表名的对话框,写入“news”单击“OK”按钮即可。</p> <p style="TEXT-ALIGN: center"><img border="0" alt="木子网页设计" src="http://www.webjx.com/files/allimg/120109/2318276.jpg" width="600" height="281"></p> <p style="TEXT-ALIGN: center"><img border="0" alt="木子网页设计" src="http://www.webjx.com/files/allimg/120109/2318277.jpg" width="600" height="71"></p> <p>好了经过上面的五个步骤,你已经建立了一个mysql数据库,并且里面 包含了一个表,你可以更具自己网站的实际需求来进行表的建设,在接下来我会继续向大家讲解关于SQLyogEnt其他方面的应用。</p>

    Read more +
  • 17

    2018-05
    利用SQLyogEnt转移Mysql数据库

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">利用SQLyogEnt对Mysql数据库进行转移.</font> </td> </tr></tbody></table> <p>如果你的PHP网站换了空间,必定要对Mysql数据库进行转移,一般的转移的方法,是备份再还原,有点繁琐,而且由于数据库版本的不一样会导致数据丢失或者出现乱码等等。下面介绍给大家一个方便的方法,就是利用SQLyogEnt对数据库进行转移。话不多说,下面直接进入正题。</p> <p>第一步,打开SQLyogEnt,链接到服务器,读取数据库信息</p> <p>第二步,点击快捷按钮的“sqlyog database synchronization wizard”按钮,如图。</p> <p style="TEXT-ALIGN: center"><img border="0" alt="木子网页设计" src="http://www.webjx.com/files/allimg/120109/2323190.jpg" width="554" height="62"></p> <p>在弹出的窗口中,选择“start a new synchronization session”,然后点击“下一步”。</p> <p style="TEXT-ALIGN: center"><img border="0" alt="木子网页设计" src="http://www.webjx.com/files/allimg/120109/2323191.jpg" width="596" height="494"></p> <p>第三步,选择转移的数据源和目标数据库,窗口左边的是数据源,右边窗口为目标数据库,设置好后点击下一步设置如图。</p> <p style="TEXT-ALIGN: center"><img style="WIDTH: 600px; HEIGHT: auto" border="0" src="http://www.webjx.com/files/allimg/120109/2323192.jpg" width="603" height="500" alt=""></p> <p>第四步,页面会跳转到下一个窗口,一般选择默认设置就可以了,然后点击下一步,如图。</p> <p style="TEXT-ALIGN: center"><img border="0" src="http://www.webjx.com/files/allimg/120109/2323193.jpg" width="590" height="490" alt=""></p> <p>第五步,这一步是要你选择要转移的表,你可以选择某一个表的转移,也可以将整个数据库转移,只要在需要转移的表的全面打钩就可以了,然后点击下一步,详细如图。</p> <p style="TEXT-ALIGN: center"><img border="0" alt="木子网页设计" src="http://www.webjx.com/files/allimg/120109/2323194.jpg" width="588" height="490"></p> <p>第六步,这一步是要保存项目,默认设置就可以了,然后下一步,如图。</p> <p style="TEXT-ALIGN: center"><img border="0" alt="木子网页设计" src="http://www.webjx.com/files/allimg/120109/2323195.jpg" width="592" height="491"></p> <p>第七步,这一步程序将自动进行数据库转移,等待转移好了,点击下一步,OK,整个转移操作就结束了,是不是很简单啊。</p> <p style="TEXT-ALIGN: center"><img border="0" src="http://www.webjx.com/files/allimg/120109/2323196.jpg" width="596" height="488" alt=""></p> <p style="TEXT-ALIGN: center"><img style="WIDTH: 600px; HEIGHT: auto" border="0" alt="木子网页设计" src="http://www.webjx.com/files/allimg/120109/2323197.jpg" width="601" height="497"></p>

    Read more +