标签: mysql

  • MariaDB

    MySQL联合创始人Monty Widenius提供了MySQL的分支MariaDB候选版本。据报道MariaDB 5.1完全兼容MySQL 5.1,这个版本早在2008年11月就发布了,增加了很多新的功能和若干个新的补丁程序。开发者称这个候选版本非常稳定,将在不久的将来发布。

      MariaDB基于事务的Maria存储引擎,替换了MySQL的MyISAM存储引擎,它使用了Percona的 XtraDB,InnoDB的变体,分支的开发者希望提供访问即将到来的MySQL 5.4 InnoDB性能。这个版本还包括了 PrimeBase XT (PBXT) 和 FederatedX 存储引擎。

      这个项目的更多的代码都改编于 MySQL 6.0,例如  “pool of threads”功能提供解决多数据连接问题。MariaDB 5.1.41 RC可以到这里下载,32位和64位已编译Linux版本,还包括源代码包。MariaDB基于GPL 2.0发布。

  • Help China save MySQL!

    今天收到一封邮件,是mysql的拯救邮件,上次参加了他们的签名,但是看邮件似乎是效果不大,一再呼吁我们再次行动起来。其实他们可能不太了解中国的情况,你们的新闻在新浪和cnbeta我都看到过,其实并不是宣传的不到位,而是我们对开源的保护意识还没有达到这个层次,如果有时间可以看看我们的最流行的几款开源程序的License没有一款是真的开源,全部附带着商业的信息,不过我们应该意识到开源是很好东西,我们要培养这样的意识去维护它。其实我看到很多我们的开源意识的开发者已经放弃mysql并且开始去使用PostgresSQL,所以我们真正使用过mysql的人员都没有要去保护它的意思,这个是我要发这篇文章的目的,我们有一句老话叫“人不能忘本”假如有一天PostgresSQL也被收购了呢,商业化走向趋势的时候你还选择什么呢?

    以下是邮件原文:

    亲爱的拯救MySQL的中国签名支持者,

    (更多…)

  • 拯救MYSQL,在线签署请愿书

    如甲骨文把MySQL按照太阳微电子的一部分收购,将由数据库客户买单。
    2009年4月,甲骨文宣布 其同意收购太阳微电子。由于太阳微电子已于上一年收购了MySQL,这就意味着闭源数据库市场的领先者,甲骨文,将拥有最受欢迎的开源数据库,MySQL。

    如果甲骨文就此收购MySQL,它会像金钱能够买断一个开源项目一样对MySQL进行控制。事实上,对于大多数开源项目(例如Linux或Apache),一个竞争者甚至无法通过任何可与之媲美的方式购得这种影响的十分之一。但MySQL的成功一直都依赖于其背后开发、销售和推广它的公司。公司(最开始MySQL AB,然后太阳微电子)始终拥有重要的知识产权(IPRs)、最著名的商标、版权及(目前为止仅仅用于防御性目的)专利。知识产权产生收入,并将这些收入的大部分重新投入到开发中,因此随着时间推移,不仅规模越来越大,同时也发展得越来越好。

    如果这些知识产权落入MySQL的主要竞争对手手中,那么MySQL将即刻不再是甲骨文的商业高价产品的替代品。到目前为止,客户可以在新项目中选择使用MySQL,而不选择甲骨文产品。某些大型公司甚至为现有的软件解决方案从甲骨文迁移(转换)到MySQL。而且,每个人都可通过使用MySQL对甲骨文销售人员施加实在的威胁,以获得大幅折扣。如甲骨文拥有MySQL,那么做这种尝试的客户只能得到被嘲笑的结果。对于甲骨文来说,铲除这一问题将为其轻松产生每年不下10亿美元的收益。

    http://www.helpmysql.org/cn/theissue/customerspaythebill

  • wordpress数据库备份

      wordpress数据库备份虽然是有插件的,但是对于数据库过大的wordpress来说,还一直没有好的解决办法,我的博客应该还不算危机的,一些其他博友的恐怕已经有几十兆的数据库了,这样压缩了以后恐怕也有几兆数据,在以后呢?恐怕很危险了,因为自动备份插件发送邮箱,大附件是行不通的这个是没有办法的,所以数据库大了,只能另寻方法,另外对于用虚拟主机的朋友来说只能用phpmyadmin这样的网页数据库管理软件来恢复数据,但是这样也同样存在一个问题,页面提交数据是有限的,一般都是提交不了大数据的,所以数据库大了数据的恢复也是一个大问题。

    本着解决这个问题,我看了下国内主流程序都采用分卷备份的方法,比如discuz、dedecms等等几乎无一不是这样,那么wordpress似乎并没有分卷备份的功能,插件是否用我也不太清楚,但是是可以再其他程序里面提取一份备份功能的。这样就能分卷备份wordpress数据了,那么想好思路决定用dedecms提取,这个是可以自动检测到表的默认备份系统自带的数据表,但是提示额外的数据表,一样可以备份。另外还有一个就是专门针对mysql数据库备份开发的程序,帝国备份,这个是我刚测试使用的,效果还不错,能够解决mysql的问题,自然wordpress也解决了,所以就推荐使用类似备份程序。如果wordpress有类似的备份插件也可以介绍给我。

  • MySQL存储引擎INNODB,MyISAM的区别及其启动方法

    存储引擎是什么?
    MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
    例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。

    这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。
    选择如何存储和检索你的数据的这种灵活性是MySQL为什么如此受欢迎的主要原因。其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储。遗憾的是,其它类型的数据库解决方案采取的“一个尺码满足一切需求”的方式意味着你要么就牺牲一些性能,要么你就用几个小时甚至几天的时间详细调整你的数据库。使用MySQL,我们仅需要修改我们使用的存储引擎就可以了。
    在这篇文章中,我们不准备集中讨论不同的存储引擎的技术方面的问题(尽管我们不可避免地要研究这些因素的某些方面),相反,我们将集中介绍这些不同的引擎分别最适应哪种需求和如何启用不同的存储引擎。为了实现这个目的,在介绍每一个存储引擎的具体情况之前,我们必须要了解一些基本的问题。
    如何确定有哪些存储引擎可用
    你可以在MySQL(假设是MySQL服务器4.1.2以上版本)中使用显示引擎的命令得到一个可用引擎的列表。
    mysql> show engines;
    +————+———+—————————————————-+
    | Engine | Support | Comment |
    +————+———+—————————————————–+
    | MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance |
    | HEAP | YES | Alias for MEMORY |
    | MEMORY | YES | Hash based, stored in memory, useful for temporary tables |
    | MERGE | YES | Collection of identical MyISAM tables |
    | MRG_MYISAM | YES | Alias for MERGE |
    | ISAM | NO | Obsolete storage engine, now replaced by MyISAM |
    | MRG_ISAM | NO | Obsolete storage engine, now replaced by MERGE |
    | InnoDB | YES | Supports transactions, row-level locking, and foreign keys |
    | INNOBASE | YES | Alias for INNODB |
    | BDB | NO | Supports transactions and page-level locking |
    | BERKELEYDB | NO | Alias for BDB |
    | NDBCLUSTER | NO | Clustered, fault-tolerant, memory-based tables |
    | NDB | NO | Alias for NDBCLUSTER |
    | EXAMPLE | NO | Example storage engine |
    | ARCHIVE | NO | Archive storage engine |
    | CSV | NO | CSV storage engine |
    +————+———+——————————————————-+  
    16 rows in set (0.01 sec)   这个表格显示了可用的数据库引擎的全部名单以及在当前的数据库服务器中是否支持这些引擎。
    对于MySQL 4.1.2以前版本,可以使用mysql> show variables like “have_%”(显示类似“have_%”的变量):

    mysql> show variables like “have_%”;
    +——————+———-+
    | Variable_name | Value |
    +——————+———-+
    | have_bdb | YES |
    | have_crypt | YES |
    | have_innodb | DISABLED |
    | have_isam | YES |
    | have_raid | YES |
    | have_symlink | YES |
    | have_openssl | YES |
    | have_query_cache | YES |
    +——————+———-+
    8 rows in set (0.01 sec)  

    你可以通过修改设置脚本中的选项来设置在MySQL安装软件中可用的引擎。如果你在使用一个预先包装好的MySQL二进制发布版软件,那么,这个软件就包含了常用的引擎。然而,需要指出的是,如果你要使用某些不常用的引擎,特别是CSV、RCHIVE(存档)和BLACKHOLE(黑洞)引擎,你就需要手工重新编译MySQL源码 。
    使用一个指定的存储引擎
    你可以使用很多方法指定一个要使用的存储引擎。最简单的方法是,如果你喜欢一种能满足你的大多数数据库需求的存储引擎,你可以在MySQL设置文件中设置一个默认的引擎类型(使用storage_engine 选项)或者在启动数据库服务器时在命令行后面加上–default-storage-engine或–default-table-type选项 。

    更灵活的方式是在随MySQL服务器发布同时提供的MySQL客户端时指定使用的存储引擎。最直接的方式是在创建表时指定存储引擎的类型,向下面这样:

      CREATE TABLE mytable (id int, title char(20)) ENGINE = INNODB  
    你还可以改变现有的表使用的存储引擎,用以下语句:

      ALTER TABLE mytable ENGINE = MyISAM  
    然而,你在以这种方式修改表格类型的时候需要非常仔细,因为对不支持同样的索引、字段类型或者表大小的一个类型进行修改可能使你丢失数据。如果你指定一个在你的当前的数据库中不存在的一个存储引擎,那么就会创建一个MyISAM(默认的)类型的表。
    各存储引擎之间的区别

    为了做出选择哪一个存储引擎的决定,我们首先需要考虑每一个存储引擎提供了哪些不同的核心功能。这种功能使我们能够把不同的存储引擎区别开来。我们一般把这些核心功能分为四类:支持的字段和数据类型、锁定类型、索引和处理。一些引擎具有能过促使你做出决定的独特的功能,我们一会儿再仔细研究这些具体问题。
    字段和数据类型
    虽然所有这些引擎都支持通用的数据类型,例如整型、实型和字符型等,但是,并不是所有的引擎都支持其它的字段类型,特别是BLOG(二进制大对象)或者TEXT文本类型。其它引擎也许仅支持有限的字符宽度和数据大小。
    这些局限性可能直接影响到你可以存储的数据,同时也可能会对你实施的搜索的类型或者你对那些信息创建的索引产生间接的影响。这些区别能够影响你的应用程序的性能和功能,因为你必须要根据你要存储的数据类型选择对需要的存储引擎的功能做出决策。

    锁定

    数据库引擎中的锁定功能决定了如何管理信息的访问和更新。当数据库中的一个对象为信息更新锁定了,在更新完成之前,其它处理不能修改这个数据(在某些情况下还不允许读这种数据)。
    锁定不仅影响许多不同的应用程序如何更新数据库中的信息,而且还影响对那个数据的查询。这是因为查询可能要访问正在被修改或者更新的数据。总的来说,这种延迟是很小的。大多数锁定机制主要是为了防止多个处理更新同一个数据。由于向数据中插入信息和更新信息这两种情况都需要锁定,你可以想象,多个应用程序使用同一个数据库可能会有很大的影响。

    不同的存储引擎在不同的对象级别支持锁定,而且这些级别将影响可以同时访问的信息。得到支持的级别有三种:表锁定、块锁定和行锁定。支持最多的是表锁定,这种锁定是在MyISAM中提供的。在数据更新时,它锁定了整个表。这就防止了许多应用程序同时更新一个具体的表。这对应用很多的多用户数据库有很大的影响,因为它延迟了更新的过程。
    页级锁定使用Berkeley DB引擎,并且根据上载的信息页(8KB)锁定数据。当在数据库的很多地方进行更新的时候,这种锁定不会出现什么问题。但是,由于增加几行信息就要锁定数据结构的最后8KB,当需要增加大量的行,也别是大量的小型数据,就会带来问题。

    行级锁定提供了最佳的并行访问功能,一个表中只有一行数据被锁定。这就意味着很多应用程序能够更新同一个表中的不同行的数据,而不会引起锁定的问题。只有InnoDB存储引擎支持行级锁定。

    建立索引

    建立索引在搜索和恢复数据库中的数据的时候能够显著提高性能。不同的存储引擎提供不同的制作索引的技术。有些技术也许会更适合你存储的数据类型。
    有些存储引擎根本就不支持索引,其原因可能是它们使用基本表索引(如MERGE引擎)或者是因为数据存储的方式不允许索引(例如FEDERATED或者BLACKHOLE引擎)。

    事务处理
    事务处理功能通过提供在向表中更新和插入信息期间的可靠性。这种可靠性是通过如下方法实现的,它允许你更新表中的数据,但仅当应用的应用程序的所有相关操作完全完成后才接受你对表的更改。例如,在会计处理中每一笔会计分录处理将包括对借方科目和贷方科目数据的更改,你需要要使用事务处理功能保证对借方科目和贷方科目的数据更改都顺利完成,才接受所做的修改。如果任一项操作失败了,你都可以取消这个事务处理,这些修改就不存在了。如果这个事务处理过程完成了,我们可以通过允许这个修改来确认这个操作。

  • MySQL升级的3种方法

    MySQL数据库的版本更新很快,新的特性也随之不断的更新,更主要的是解决了很多影响我们应用的BUG,为了让我们的MySQL变得更美好,我们有必要去给它升级,尽管你会说它现在已经跑得很好很稳定完全够用了。下面我们来看看几种常用的升级方法。

    介绍之前,我们先做一些声明,MySQL采用二进制包来安装,升级都是在同一台DB Server上操作。

    第一种,很简单,适用于任何存储引擎。

    1. 下载并安装好新版本的MySQL数据库,并将其端口改为3307(避免和旧版本的3306冲突),启动服务。

    2. 在新版本下创建同名数据库。

    # mysqldump  -p3307  -uroot  create mysqlsystems_com

    3. 在旧版本下备份该数据库。

    # mysqldump  -p3306  -uroot  mysqlsystems_com > mysqlsystems_com.bk

    Note: 你也可以加上–opt选项,这样可以使用优化方式将你的数据库导出,减少未知的问题。

    4. 将导出的数据库备份导入到新版本的MySQL数据库中。

    # mysql -p3307 -uroot mysqlsystems_com < mysqlsystems_com.bk

    5. 再将旧版本数据库中的data目录下的mysql数据库全部覆盖到新版本中。

    # cp -R /opt/mysql-5.1/data/mysql  /opt/mysql-5.4/data

    Note: 大家也都知道这个默认数据库的重要性。

    6. 在新版下执行mysql_upgrade命令,其实这个命令包含一下三个命令:

    # mysqlcheck –check-upgrade –all-databases –auto-repair
    # mysql_fix_privilege_tables
    # mysqlcheck –all-databases –check-upgrade –fix-db-names –fix-table-names

    Note: 在每一次的升级过程中,mysql_upgrade这个命令我们都应该去执行,它通过mysqlcheck命令帮我们去检查表是否兼容新版本的数据库同时作出修复,还有个很重要的作用就是使用mysql_fix_privilege_tables命令去升级权限表。

    7. 关闭旧版本,将新版的数据库的使用端口改为3306,重新启动新版本MySQL数据库。到此,一个简单环境下的数据库升级就结束了。

     

    第二种,同样适用任何存储引擎。

    1. 同样先安装好新版本的MySQL。

    2. 在旧版本中,备份数据库。

    # mkdir /opt/mysqlsystems_bk  ;  mysqldump -p3306 -uroot –tab=/opt/mysqlsystems_bk  mysqlsystems_com

    Note: –tab选项可以在备份目录mysqlsystems_bk下生成后缀为*.sql和*.txt的两类文件;其中,.sql保存了创建表的SQL语句而.txt保存着原始数据。

    3. 接下来在新版本的数据库下更新数据。

    # mysqladmin -p3307 -uroot create mysqlsystems_com

    # cat /opt/mysqlsystems_bk/*.sql | mysql -p3307 -uroot  mysqlsystems_com       ( Create Tables )

    # mysqlimport mysqlsystems_com /opt/mysqlsystems_bk/*.txt            ( Load Data )

    4. 之后的所有步骤与第一种方法的后三步5、6、7相同。

    第三种,适用于MyISAM存储引擎,全部是文件间的拷贝。

    1. 安装。

    2. 从旧版本mysqlsystems_com数据库下将所有.frm、.MYD 和.MYI文件拷贝到新版本的相同目录下。

    3.之后的步骤依然同于第一种的后三步。

    以上就是三种升级MySQL的方法,看似没有出现什么问题,其实,在实际的生产环境中,为会有诸多问题发生,这就需要我们在升级之前充分了解新版本中增加了哪些新功能,进一步分析升级以后这些新特性是否将会对我们原来应用产生影响。

  • 另类MYSQL数据批量修改

       今天在整理网站的时候,发现一个郁闷的问题,就是有大量重复内容需要更改,但是没有什么工具,SQL语句也不熟悉了,危急之时想到了一个不错的办法,就是把数据库导出来,然后用记事本替换,达到要求,目前还是不错。

  • APMServ网站服务器平台

    APMServ 是一款拥有图形界面的快速搭建Apache、PHP、MySQL、Nginx、Memcached、phpMyAdmin、OpenSSL、SQLite、
    ZendOptimizer,以及ASP、CGI、Perl网站服务器平台的绿色软件。无需安装,具有灵活的移动
    性,将其拷贝到其它目录、分区或别的电脑时,均只需点击APMServ.exe中的启动按钮,即可自
    动进行相关设置,将Apache和MySQL安装为系统服务并启动。APMServ集合了Apache稳定安全的
    优点,并拥有跟IIS一样便捷的图形管理界面,同时支持MySQL 5.0 & 4.0两个版本,虚拟主机、
    虚拟目录、端口更改、SMTP、上传大小限制、自动全局变量、SSL证书制作、缓存性能优化等设
    置,只需鼠标一点即可完成。

    官方地址:http://apmserv.s135.com/

  • MySQL查询优化讲座之管理员的优化措施

     前面的部分中讲解的优化措施都是没有特权的MySQL用户能够执行的。可以控制MySQL服务器或计算机的系统管理员能够执行额外的优化措施。例如,有些服务器参数附属于查询处理过程,并且是可以调整的,而且某些硬件配置因素对查询处理速度有直接的影响。在很多情况下,这些优化措施提高了整个服务器的性能,因此可以让所有的MySQL用户都受益。

      一般来说,当你执行管理员优化的时候,应该紧记以下规则:

      • 访问内存中的数据快于访问磁盘上的数据。

      • 尽量把数据保存在内存中可以减少磁盘操作。

      • 保留索引中的信息比保留数据记录的内容更重要。

      我们在后面将讨论如何应用这些规则。

      增加服务器缓存的大小。服务器拥有很多参数(系统变量),你可以改变这些参数来影响服务器的操作。其中的几个参数直接地影响查询处理的速度。你可以改变的最重要的参数是数据表缓存的大小和存储引擎用于缓冲索引操作信息的缓存大小。如果你拥有可用的内存,就把它分配给服务器的缓存,以允许信息存储在内存中并减少磁盘操作。这会有很好的效果,因为访问内存中的信息比从磁盘读取信息的速度快得多。

      • 当服务器打开表文件的时候,它试图保持这些文件的打开状态,以减少打开文件操作的数量。为了实现这样的功能,它在表缓存中维护打开文件的信息。table_cache系统变量控制着这个缓存的大小。如果服务器访问了大量的表,表缓存就会被填满,并且服务器会关闭那些有一段时间没有使用的表,为打开新表留出空间。你可以通过检查Opened_tables状态指示器来访问表缓存的效果:
    CODE:

    SHOW STATUS LIKE ’Opened_tables’;
      Opened_tables显示了某个数据表必须打开的次数(因为它还没有打开)。这个值也显示为mysqladmin状态命令的输出信息中的Opens值。如果这个数字是稳定的或缓慢增长,那么它的设置可能是正确的。如果这个数字增长得很快,就意味着这个缓存太小了,必须经常关闭数据表来为打开其它的数据表留出空间。如果你拥有文件描述信息,增加表缓存大小将减少数据表打开操作的数量。

      • MyISAM存储引擎使用键缓冲来保持与索引相关的操作的索引信息块。它的大小是由key_buffer_size系统变量控制的。这个值越大,MySQL就一次性在内存中保持更多的索引信息块,可以增加在内存中(而不用从磁盘上读取新的信息块)找到键值的可能性。键缓存的默认大小是8MB。如果你拥有很多的内存,这是一个很保守的值,你可以直接增加它的大小,并且会看到基于索引的检索、索引的建立和修改操作的性能有很大改善。

      在MySQL 4.1以上版本中,你可以为MyISAM数据表建立附加的键缓存,并指定某些表使用它们。这样可以帮助提高这些数据表上的查询处理速度。

      • InnoDB和BDB引擎拥有自己的用于缓冲数据和索引值的缓存。它们的大小是由innodb_buffer_pool_size和bdb_cache_size变量控制的。InnoDB引擎还维护了一个日志缓冲。innodb_log_buffer_size变量可以控制它的大小。

      • 另一个专用的缓存是查询缓存,我们在”使用查询缓存”部分中解释。

      当你改变这些参数值的时候,应该遵循下面一些原则:

      • 每次只改变一个参数。如果你一次改变多个相互独立的变量,那么就很难评估每种改变的效果了。

      • 逐渐地增加系统变量值。根据理论,数量越多,性能越好,但是如果你使某个变量变得太大了,有可能造成系统资源匮乏,导致逆向效果,降低速度。

      • 不要在运行业务MySQL数据库的服务器上做调整参数的实验,最好建立一个独立的测试服务器。

      • 为了大致了解哪种参数变量可能适合自己的系统,你可以查看MySQL发布文档中包含的my-small.cnf、my-medium.cnf、my-large.cnf和my-huge.cnf选项文件(在Unix系统上,你可以在源发布文件的支持文件目录和二进制发布文件的共享目录总找到这些文件。在Windows上,它们位于基本的安装目录中,其扩展名可能是.ini)。这些文件可能让你知道最好改变服务器上的那些参数以适应不同的使用层次,并且为这些参数提供了一些典型值。

      用于提高服务器的操作性能的其它一些策略还包括:

      禁止不需要的存储引擎。服务器不会为禁止的引擎分配任何内存,因此我们可以利用这一点。如果从源文件建立MySQL,那么在配置的时候,大多数存储引擎就可以被排除在服务器之外。对于那些包含在服务器中的引擎来说,使用适当的启动选项可以在运行时禁止其中的大多数。
    保持授权表许可的简单性。尽管服务器在内存中缓存了授权表内容,但是如果你在tables_priv或columns_priv表中有一些数据行的话,服务器就必须为每个查询语句检查表层次和列层次的权限。如果这些表是空的,那么服务器就能优化自己的权限检查过程,略过这些层次。

      如果你从源文件建立MySQL,那么就把它配置为使用静态类库,而不要使用共享类库。使用共享类库的动态二进制文件节约磁盘空间,然而静态二进制文件速度更快。但是,如果你使用了用户自定义函数(UDF)机制,那么有些系统要求使用动态链接。在这类系统上,静态二进制文件不能工作。

      使用MyISAM键缓存

      当MySQL执行某个利用了MyISAM数据表索引的语句的时候,它会使用键缓存来保持索引值。这种缓存减少了磁盘I/O:如果在缓存中找到了某个数据表需要的键值,就不需要再次从磁盘中读取。不幸的是,这种键缓存是有限的,并且在默认情况下,它是所有的MyISAM数据表共享使用的。如果在键缓存中没有找到键值并且键缓存是满的,争用将会导致:必须丢弃缓存中的某些值,为新值留出空间。如果下次需要那些已经被丢弃的值,就必须再次从磁盘上读取。

      如果你很倚重MyISAM数据表,那么把它的键保存在内存中效果会很好,但是缓存中的争用却会导致相反的效果。从同一张表或不同的表读取数据都可能引起争用。你可以通过把键缓存设置成足以保存某个特定数据表的全部索引,从而避免同一张数据表的争用,但是其它数据表的键仍然需要争用缓存空间。

      MySQL 4.1以上版本为这个问题提供了一种解决方案:它支持我们建立多个键缓存,并允许我们把某张数据表的索引指定并且预先装入某个缓存。如果你的数据表使用得很频繁,并且你有足够的内存,能够把它的索引载入缓存中,那么这种操作就是有用的。这种能力允许你同时避免同一张表和不同的表的争用:建立一个足够大的缓存,让它保存数据表的全部索引,并且指定该缓存专门用于那张数据表。在键被载入缓存之后,不在需要磁盘I/O操作。同时,键值永远不会被丢弃,对数据表的键的查看操作可以在内存中完成。

      下面的例子显示了如何为sampdb数据库的member数据表建立一个键缓存,该缓存的名称是member_cache,大小为1MB。执行这些指令的时候,你必须有超级(SUPER)权限。

      1.建立一个足够容纳数据表索引的独立的缓存:
    CODE:

    mysql> SET GLOBAL member_cache.key_buffer_size = 1024*1024;
      2.给数据表指定键缓存:
    CODE:

    mysql> CACHE INDEX member IN member_cache;
    +—————+——————–+———-+———-+
    | Table | Op | Msg_type | Msg_text |
    +—————+——————–+———-+———-+
    | sampdb.member | assign_to_keycache | status | OK |
    +—————+——————–+———-+———-+
      3.把数据表索引预先读入它的键缓存中:
    CODE:

    mysql> LOAD INDEX INTO CACHE member;
    +—————+————–+———-+———-+
    | Table | Op | Msg_type | Msg_text |
    +—————+————–+———-+———-+
    | sampdb.member | preload_keys | status | OK |+—————+————–+———-+———-+
      如果你希望把其它的数据表载入同一个缓存中,或者为其它的数据表建立键缓存,上面的操作就足够了。

  • 甲骨文收购sun

      格局又有变化了,具体情况我也没能详细看,似乎是关系到MYSQL和一些其他的东西,目前PHP+MYSQL是很流行的,mysql自己也是相当有分量的,希望不会从此消失,不过之前的版本也一样很出色了,代码也是开源的,也不必过分担心。

  • MySQL中SQL的单字节注入与宽字节注入

    一、单字节SQL注入

    MYSQL的SQL注入已经由来已久,以下是普遍采用的注入步骤:

    1、在GET参数上加一个/*或者#(mysql专有的注释),判断数据库是否是mysql,比如:
    http://www.xxx.com.cn/article.php?id=1607 and 1=1/*

    2、猜解某表的字段数,从order by 1一直更改到页面出错为止,就可以得到该表的字段数

    注入URL:http://www.xxx.com.cn/article.php?id=1607 or 1=1 order by 10#

    对应的SQL: select * from articles where id=1607 or 1=1 order by 10#….
    3、使用该表和用户表进行关联查询,在文章列表里就可以看到用户名和密码了。当也要猜解用户表的表名和用户名、密码的字段名,比如上一步得到的字段数是5:

    注入的URL:http://www.xxx.com.cn/article.php?id=1607 or 1=1 union select  username,password,1,2,3 from user

    对应的SQL: select * from articles where id=1607 or 1=1  union select  username,password,1,2,3 from user
    这样就可以在界面上看到用户名和密码了。

    解决方法:

    过滤数据:这并不是罗唆。在合适的地方使用良好的数据过滤,可以减小多数安全隐患,甚至可以消除其中的一部分。

    将数据用括号包含:如果你的数据库允许(MySQL 允许),在 SQL 语句中,不论什么类型的数据都用单引号包含起来。

    转义数据:一些合法的数据可能在无意中破坏 SQL 语句本身的格式。使用 mysql_escape_string() 或者所使用数据库提供的转移函数。如果没有提供这样的函数,addslashes() 也是不错的最后选择。

    二、宽字节注入

    宽字节注入也是在最近的项目中发现的问题,大家都知道%df’ 被PHP转义(开启GPC、用addslashes函数,或者icov等),单引号被加上反斜杠\,变成了 %df\’,其中\的十六进制是 %5C ,那么现在 %df\’ = %df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则MYSQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是縗’,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了。比如:

    以下为引用的内容:

    $conn = mysql_connect(”localhost”,”root”,”2sdfxedd”);
    mysql_query(”SET NAMES ‘GBK’”);
    mysql_select_db(”test”,$conn);
    $user = mysql_escape_string($_GET[‘user’]);
    $pass = mysql_escape_string($_GET[‘pass’]);
    $sql = “select * from cms_user where username = ‘$user’ and password=’$pass’”;
    $result = mysql_query($sql,$conn);
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    $rows[] = $row;
    }
    ?>
     

     

    则通过以下注入即可:

    http://www.xxx.com/login.php?user=%df’%20or%201=1%20limit%201,1%23&pass=

    对应的SQL是:

    select * from cms_user where username = ‘運’ or 1=1 limit 1,1#’ and password=”

    解决方法:就是在初始化连接和字符集之后,使用SET character_set_client=binary来设定客户端的字符集是二进制的。如:

    以下为引用的内容:

    mysql_query(”SET character_set_client=binary”);

  • 禁用wordpress文章版本管理功能和删除已有的历史记录文章版本

    禁用 WordPress 文章版本管理功能

    之前是用 define(‘WP_POST_REVISIONS’, false);

    不过2.7更新出来WPchina.org的写法是

    /**
    * WordPress 版本管理功能
    *
    * 对于绝大多数网友而言,并不需要版本管理功能。你可以在这里关闭此功能。
    * 当参数 n = -1 时,保留所有文章/页面的修订版本;这是默认值;
    * 当参数 n = 0 时,保留0次文章/页面的修订版本,即关闭该功能;
    * 当参数 n > 0 时,保留n次文章/页面的修订版本。
    *
    * @added by WPChina.org
    */
    define(‘WP_POST_REVISIONS’, ‘-1’);

    删除 WordPress 已有的文章版本历史

    这个是比较头疼的问题,虽然关闭了版本但是以前的文章版本却还是存在的,在网上找到SQL语句,可以删除历史文章版本,经过使用确实能够删除。

    DELETE FROM wp_postmeta WHERE post_id IN (SELECT id FROM wp_posts WHERE post_type = ‘revision’);

    DELETE FROM wp_term_relationships WHERE object_id IN (SELECT id FROM wp_posts WHERE post_type=’revision’);

    DELETE FROM wp_posts WHERE post_type=’revision’;

    另外需要注意的是MYSQL4是不能用的,我的空间恰恰是MYSQL4,无奈之前把数据库搬到自己电脑上去升级。MYSQL4到MYSQL5是挺容易的 MYSQL5到MYSQL4却费了半天劲,首先需要去掉一个 SQL_MODE=”NO_AUTO_VALUE_ON_ZERO”; 另外MYSQL4是不支持编码的 WORDPRESS是UTF8的编码 所以还要去掉DEFAULT CHARSET=utf8 ,至此删除干净历史遗留问题,心情顺畅。

  • DEDECMS5.3正式版

      新版本发布了,这次的更新是内核级的更新,论坛里面有了数据压力测试看上去效果是不错的,dede是我使用过较多的CMS系统,其开源简单可以很容易的把他变成任何类型的网站,模板的制作也非常简单,现在的采集功能似乎是每个CMS必备的了,我也因此不必在去手动更新每一篇文章,不过带来的就是被搜索引擎无情的K出去,也因为它我感觉到我在做垃圾站,可以说是又爱又恨。不过发布新版本还是挺高兴的,现在在用5.3的测试版依然在疯狂的采集,就是采集的时候时常碰到超时还是错误,导致不在自动采集,希望能在正式版中得到解决,希望这个系统越来越好吧,是国内开源程序里面比较喜欢的一款。

    官方论坛:http://bbs.dedecms.com/

    PS:我以前听说会出一个以3.1为基础的简洁版,不过这个并不出功能太庞大了。

  • 将sql server的数据转成mysql

    第一种是安装mysql ODBC,利用sql server的导出功能,选择mysql数据源,进行数据的直接导出,这种方法很简便,但是针对实际应用有很多弊端,最主要体现就是数据类型问题,首先,sql server数据库中
    的ntext,image等数据类型的数据无法直接写入到mysql数据库中,据说只要稍加改动就可以,可惜偶这只菜鸟还没想到如何改动,其次,因为偶在mysql中的数据库设计中将时间都设成int型(保存的是时间戳),所以在数据导过来后,就会出现冲突,再次,这种方法生成的mysql数据表的字段类型都不很合适,所以此种方法我觉得不能提倡。

    第二种是利用php或asp脚本来实现数据的导入功能,这种方法需要编写程序,但灵活性大,操作也不是那么困难,一切都尽在你的掌握之中,现简单介绍一下该方法
    前提条件是你的mysql环境已经搭建好了,先建好目标数据库,再将所有的表结构用sql语句生成,现在万事具备,只缺数据了。

    可以通过下面的php脚本来实现sql server中mydb数据库的user表中数据向mysql中mydb数据库导入
    <?
    $cnx = odbc_connect(‘web’, ‘admin’, ‘123456’);//’web’是sqlserver中mydb的数据源名,’admin’是访问mydb的用户名,’123456’是访问mydb的密码
    $cur= odbc_exec( $cnx, ‘select * from user’ );//打开sql server中mydb数据库的user表
    $num_row=0;
    $conn=mysql_pconnect(“localhost”,”root”,”123456″);// 连接mysql
    @mysql_select_db(‘mydb’,$conn) or

    die(“无法连接到数据库,请与管理员联系!”);//打开mysql的mydb数据库
    while( odbc_fetch_row( $cur )) //从sql server的mydb库中的user表逐条取出数据,如果对数据进行选择,可在前面的select语句中加上条件判断
    {
    $num_row++;
    $field1 = odbc_result( $cur, 1 ); // 这里的参数i(1,2,3..)指的是记录集中的第i个域,你可以有所选择地进行选取,fieldi得到对应域的值,然后你可以对fieldi进行操作
    $field2 = odbc_result( $cur, 2 );
    $field3 = odbc_result( $cur, 3 );
    $field4 = odbc_result( $cur, 4 );
    $field5 = odbc_result( $cur, 5 );
    $field6 = odbc_result( $cur, 6 );
    $field5 = timetoint($field5); //这里是对sql server中的datetime类型的字段进行相应转换处理,转换成我所需要的int型
    $querystring = “insert into user
    (id,name,username,password,recdate)
    values(‘$field1′,’$field2′,’$field3′,’$field4′,’$field5’)” ;

    mysql_query($querystring,$conn);
    }

    function timetoint($str){
    $arr1=split(” “,$str);
    $datestr=$arr1[0];
    $timestr=$arr1[1];
    $arr_date=split(“-“,$datestr);
    $arr_time=split(“:”,$timestr);
    $year=$arr_date[0];
    $month=$arr_date[1];
    $day=$arr_date[2];
    $hour=$arr_time[0];
    $minute=$arr_time[1];
    $second=$arr_time[2];
    $time_int=mktime($hour,$minute,$second,$month,$day,$year);
    return $time_int;
    }
    ?>

    将该段脚本存成sql.php,在服务器上执行,就可以将服务器上sql server中mydb数据库的user表中的数据导入到mysql中mydb数据库的user表中去。其他表的操作与此雷同,就不赘述了。

    下面再介绍一下asp脚本实现sql server中mydb数据库的数据向mysql中mydb数据库导入
    <%
    set conn=server.createobject(“adodb.connection”)
    conn.open ‘web’, ‘admin’, ‘123456’ // ‘web’是sqlserver中mydb的数据源名,’admin’是访问mydb的用户名,’123456’是访问mydb的密码
    set rs=server.createobject(“adodb.recordset”)
    sql=”select ID,name,username,password,datediff(s,’1970-01-01 00:00:00’,recdate)-8*3600,reid,filename,fileContentType,filevalue from senddate” //这条sql语句实现了将datetime类型的recdate字段转化成unix时间戳的int型

    rs.open sql,conn,1,3
    set conn1=server.createobject(“adodb.connection”)
    conn1.open “myoa”,”root”,”q1-d6=7?”
    i=1
    do while not rs.eof
    field1 = rs(0)
    field2 = rs(1)
    field3 = rs(2)
    field4 = rs(3)
    field5 = rs(4)
    sql1 = “insert into user(ID,name,username,password,recdate)

    values(“&field1&”,’”&field2&”‘,’”&field3&”‘,’”&field4&”‘,”&field5&”)”

    conn1.execute sql1
    rs.movenext
    i=i+1
    loop
    rs.close
    set rs=nothing
    conn.close
    set conn=nothing
    conn1.close
    set conn1=nothing

    %>

    以上两个是分别采用php脚本和asp脚本对user表的数据进行由sql server到mysql的导入其间我采用2种回避的方法来避免ntext,image类型数据的传递,一种是将ntext字段改为nvarchar(4000),因为实际情况,原始数据中该字段的数据长度都未超过4000个字,所以并没有出现数据截断,另一个手段是将image类型数据取出来写到文件中,以文件形式保存,将文件路径存到数据库中,方法见下:

    function makeattach(fileContentType,filevalue,i)
    select case fileContentType
    case “application/msword”
    ext=”doc”

    case “application/vnd.ms-excel”
    ext=”exl”

    case “application/vnd.ms-powerpoint”
    ext=”pps”

    case “application/x-rar-compressed”
    ext=”rar”

    case “application/x-zip-compressed”
    ext=”zip”

    case “image/gif”
    ext=”gif”

    case “image/pjpeg”
    ext=”jpg”

    case “text/plain”
    ext=”txt”

    case else
    ext=”x”

    end select
    if ext<>”x” then
    set fso=server.createobject(“FileSystemObject”)
    fName=”attech”&i&”.”&ext
    Dir=”d:attach”
    If fso.FileExists(Dir & fName) Then fso.deletefile Dir & fName
    If fName<>”” AND NOT fso.FileExists(Dir & fName) Then
    Set strm1=Server.CreateObject(“ADODB.Stream”)
    strm1.Open
    strm1.Type=1 ‘Binary
    strm1.Write filevalue
    strm1.SaveToFile Dir & fName,2
    Set strm1=Nothing
    end if
    makeattach=fName
    end if
    end function

    这个函数有3个输入参数,第一个是文件的contentType,第二个是文件的二进制数值,第三个是个可以区别文件名的变量,先根据contentType确定所存文件的后缀名,然后就是将二进制数值保存成指定文件名的文件,并将文件名作为输出参数返回,将返回的参数作为数据写到mysql的数据库中保存。
    时间匆忙,先总结到这里,希望这些文字能对有需要的人有些帮助,少走些弯路,感谢您的阅读。:)

  • PHP的编码问题

      刚开始学PHP很容易出现乱码情况,一般是因为编码不一致导致的。碰到乱码情况主要考虑三个方面:

      页面存储的编码,PHP处理数据的编码,MYSQL的数据编码。

      比如页面<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />  设定了UTF-8的编码 PHP在操作数据库的时候也设置下mysql_query(“set names ‘utf8′”); 最后就是把数据库的编码设置成utf8_general_ci  统一了编码就会少很多问题。

  • PHP与MYSQL数据库连接语句

       PHP与MYSQL数据库连接语句

    mysql_connect(“localhost”, “username”, “password”)

       数据库选择

    mysql_select_db(“test”)

  • 常用的几种数据库比较

       ACCESS :我刚开始写网页不外乎是ASP +ACCESS 那个时候已经觉得很厉害了,网络时代变了,现在面临淘汰了,不过这个口号已经打了好几年了还在打不知道什么时候是真正的过时。

      SQL SERVER : 上学时候学过的数据库语言,好像都会教这个课程,使用其实是差不多的都是SQL语言,就是负载能力要强,不过我使用的很少,更愿意在ACCESS和MYSQL之间进行选择。

      MYSQL :我现在经常用的数据库,说不上为什么,没有任何人教过我,都是自学还是这么的乐此不疲,其实刚开始使用只是因为它是开源的,后来知道了,他的商业使用是需要购买许可的,就是我们可以用它来开发程序,但是卖出的程序使用MYSQL是需要花钱购买的。