mysql整理

来源:互联网 发布:mac air无主之地2下载 编辑:程序博客网 时间:2024/05/02 20:01

  1.导出整个数据库

  mysqldump -u 用户名 -p 数据库名 > 导出的文件名

  mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql

  2.导出一个表

  mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名

  mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql

  3.导出一个数据库结构

  mysqldump -u wcnc -p -d --add-drop-table smgp_apps_wcnc >d:wcnc_db.sql

  -d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table

  4.导入数据库

  常用source 命令

  进入mysql数据库控制台,

  如mysql -u root -p

  mysql>use 数据库

  然后使用source命令,后面参数为脚本文件(如这里用到的.sql)

  mysql>source d:wcnc_db.sql

    有很多应用项目, 刚起步的时候用MYSQL数据库基本上能实现各种功能需求,随着应用用户的增多,数据量的增加,MYSQL渐渐地出现不堪重负的情况:连接很慢甚至宕机,于是就有把数据从MYSQL迁到ORACLE的需求,应用程序也要相应做一些修改。本人总结出以下几点注意事项,希望对大家有所帮助。

    1.自动增长的数据类型处理

    MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。

    CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1STARTWITH1 MAXVALUE99999CYCLENOCACHE;其中最大的值按字段的长度来定, 如果定义的自动增长的序列号 NUMBER(6) , 最大值为999999,INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL

    2. 单引号的处理

    MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。

    3.翻页的SQL语句的处理

    MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数;PHP里还可以用SEEK定位到结果集的位置。ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用ROWNUM<100, 不能用ROWNUM>80。
    以下是经过分析后较好的两种ORACLE翻页SQL语句( ID是唯一关键字的字段名 ):
    语句一:

SELECT ID, [FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW,ID FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3;

    语句二:

SELECT * FROM (( SELECT ROWNUM AS NUMROW,c.* from (select [FIELD_NAME,...] FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3;

     4.长字符串的处理

    长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。

    5.日期字段的处理

    MYSQL日期字段分DATE和TIME两种,ORACLE日期字段只有DATE,包含年月日时分秒信息,用当前数据库的系统时间为SYSDATE, 精确到秒,或者用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)年-月-日 24小时:分钟:秒 的格式YYYY-MM-DD HH24:MI:SS TO_DATE()还有很多种日期格式, 可以参看ORACLE DOC.日期型字段转换成字符串函数TO_CHAR(‘2001-08-01’,’YYYY-MM-DD HH24:MI:SS’)

    日期字段的数学运算公式有很大的不同。MYSQL找到离当前时间7天用 DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到离当前时间7天用 DATE_FIELD_NAME >SYSDATE - 7;

    6.空字符的处理

    MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。

    7. 字符串的模糊比较

     MYSQL里用 字段名 like '%字符串%',ORACLE里也可以用 字段名 like '%字符串%' 但这种方法不能使用索引, 速度不快,用字符串比较函数 instr(字段名,'字符串')>0 会得到更精确的查找结果。

    8. 程序和函数里,操作数据库的工作完成后请注意结果集和指针的释放。


mysql 发表于:2006.07.17 21:46 ::分类: ( 一般分类 ) ::阅读:(1323次) :: 评论 (2)
===========================================================
MySQL数据库引擎快速指导
===========================================================

    如果你是个赛车手并且按一下按钮就能够立即更换引擎而不需要把车开到车库里去换,那会是怎么感觉呢?MySQL数据库为开发人员所做的就好像是按按钮换引擎;它让你选择数据库引擎,并给你一条简单的途径来切换它。

    MySQL的自带引擎肯定是够用了,但是在有些情况下,其他的引擎可能要比手头所用更适合完成任务。如果愿意的话,你甚至可以使用MySQL++ API来创建自己的数据库引擎,就像打穿气缸装上自己的化油器。现在让我们来看看你该如何选择引擎,以及如何在可用引擎之间切换。

    选择你的引擎

    你能用的数据库引擎取决于MySQL在安装的时候是如何被编译的。要添加一个新的引擎,就必须重新编译MySQL。仅仅为了添加一个特性而编译应用程序的概念对于Windows的开发人员来说可能很奇怪,但是在UNIX世界里,这已经成为了标准。在缺省情况下,MySQL支持三个引擎:ISAM、MyISAM和HEAP。另外两种类型InnoDB和Berkley(BDB),也常常可以使用。

    ISAM

    ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MySQL能够支持这样的备份应用程序。

    MyISAM

    MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作。其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMChk工具和用来恢复浪费空间的MyISAMPack工具。

    MyISAM强调了快速读取操作,这可能就是为什么MySQL受到了Web开发如此青睐的主要原因:在Web开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和Internet平台提供商(Internet Presence Provider,IPP)只允许使用MyISAM格式。

    HEAP

    HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MyISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。让我再重复一遍:在你用完表格之后,不要忘记删除表格。

    InnoDB和Berkley DB

    InnoDB和Berkley DB(BDB)数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MySQL++ API。在使用MySQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理也不支持外来键。尽管要比ISAM和MyISAM引擎慢很多,但是InnoDB和BDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中的一个了。

    如果感觉自己的确技术高超,你还能够使用MySQL++来创建自己的数据库引擎。这个API为你提供了操作字段、记录、表格、数据库、连接、安全帐号的功能,以及建立诸如MySQL这样DBMS所需要的所有其他无数功能。深入讲解API已经超出了本文的范围,但是你需要了解MySQL++的存在及其可交换引擎背后的技术,这一点是很重要的。估计这个插件式数据库引擎的模型甚至能够被用来为MySQL创建本地的XML提供器(XML provider)。(任何读到本文的MySQL++开发人员可以把这一点当作是个要求。)


mysql 发表于:2006.07.17 21:35 ::分类: ( 一般分类 ) ::阅读:(38246次) :: 评论 (571)
===========================================================
实例讲解MYSQL数据库的查询优化技术
===========================================================

    数据库系统是管理信息系统的核心,基于数据库的联机事务处理(OLTP)以及联机分析处理(OLAP)是银行、企业、政府等部门最为重要的计算机应用之一。从大多数系统的应用实例来看,查询操作在各种数据库操作中所占据的比重最大,而查询操作所基于的SELECT语句在SQL语句中又是代价最大的语句。举例来说,如果数据的量积累到一定的程度,比如一个银行的账户数据库表信息积累到上百万甚至上千万条记录,全表扫描一次往往需要数十分钟,甚至数小时。如果采用比全表扫描更好的查询策略,往往可以使查询时间降为几分钟,由此可见查询优化技术的重要性。

    笔者在应用项目的实施中发现,许多程序员在利用一些前端数据库开发工具(如PowerBuilder、Delphi等)开发数据库应用程序时,只注重用户界面的华丽,并不重视查询语句的效率问题,导致所开发出来的应用系统效率低下,资源浪费严重。因此,如何设计高效合理的查询语句就显得非常重要。本文以应用实例为基础,结合数据库理论,介绍查询优化技术在现实系统中的运用。

    分析问题

    许多程序员认为查询优化是DBMS(数据库管理系统)的任务,与程序员所编写的SQL语句关系不大,这是错误的。一个好的查询计划往往可以使程序性能提高数十倍。查询计划是用户所提交的SQL语句的集合,查询规划是经过优化处理之后所产生的语句集合。DBMS处理查询计划的过程是这样的:在做完查询语句的词法、语法检查之后,将语句提交给DBMS的查询优化器,优化器做完代数优化和存取路径的优化之后,由预编译模块对语句进行处理并生成查询规划,然后在合适的时间提交给系统处理执行,最后将执行结果返回给用户。在实际的数据库产品(如Oracle、Sybase等)的高版本中都是采用基于代价的优化方法,这种优化能根据从系统字典表所得到的信息来估计不同的查询规划的代价,然后选择一个较优的规划。虽然现在的数据库产品在查询优化方面已经做得越来越好,但由用户提交的SQL语句是系统优化的基础,很难设想一个原本糟糕的查询计划经过系统的优化之后会变得高效,因此用户所写语句的优劣至关重要。系统所做查询优化我们暂不讨论,下面重点说明改善用户查询计划的解决方案。

    解决问题

    下面以关系数据库系统Informix为例,介绍改善用户查询计划的方法。

    1.合理使用索引

    索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下:

    ●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。

    ●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。

    ●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。

    ●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。

    ●使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。

    2.避免或简化排序

    应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:

    ●索引中不包括一个或几个待排序的列;

    ●group by或order by子句中列的次序与索引的次序不一样;

    ●排序的列来自不同的表。

    为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。

    3.消除对大型表行数据的顺序存取

    在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。

    还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序操作:

SELECTFROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008

    虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:

SELECTFROM orders WHERE customer_num=104 AND order_num>1001 UNION SELECTFROM orders WHERE order_num=1008

    这样就能利用索引路径处理查询。

    4.避免相关子查询

    一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。

    5.避免困难的正规表达式

    MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:

SELECTFROM customer WHERE zipcode LIKE “98_ _ _”

    即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。

    另外,还要避免非开始的子串。例如语句:SELECT * FROM customer WHERE zipcode[2,3]>“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。

    6.使用临时表加速查询

    把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如:

SELECT cust.name,rcvbles.balance,……other columns FROM cust,rcvbles WHERE cust.customer_id = rcvlbes.customer_id AND rcvblls.balance>0 AND cust.postcode>98000 ORDER BY cust.name

     如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序:

SELECT cust.name,rcvbles.balance,……other columns FROM cust,rcvbles WHERE cust.customer_id = rcvlbes.customer_id AND rcvblls.balance>0 ORDER BY cust.name INTO TEMP cust_with_balance

    然后以下面的方式在临时表中查询:

SELECTFROM cust_with_balance WHERE postcode>98000

    临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。

    注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。

    7.用排序来取代非顺序存取

    非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。

    有些时候,用数据库的排序能力来替代非顺序的存取能改进查询。

    实例分析

    下面我们举一个制造公司的例子来说明如何进行查询优化。制造公司数据库中包括3个表,模式如下所示:

    1.part表

    零件号零件描述其他列

    (part_num)(part_desc)(other column)

    102,032Seageat 30G disk……

    500,049Novel 10M network card……

    ……

    2.vendor表

    厂商号厂商名其他列

    (vendor _num)(vendor_name) (other column)

    910,257Seageat Corp……

    523,045IBM Corp……

    ……

    3.parven表

    零件号厂商号零件数量

    (part_num)(vendor_num)(part_amount)

    102,032910,2573,450,000

    234,423321,0014,000,000

    ……

    下面的查询将在这些表上定期运行,并产生关于所有零件数量的报表:

SELECT part_desc,vendor_name,part_amount FROM part,vendor,parven WHERE part.part_num=parven.part_num AND parven.vendor_num = vendor.vendor_num ORDER BY part.part_num

    如果不建立索引,上述查询代码的开销将十分巨大。为此,我们在零件号和厂商号上建立索引。索引的建立避免了在嵌套中反复扫描。关于表与索引的统计信息如下:

    表行尺寸行数量每页行数量数据页数量

    (table)(row size)(Row count)(Rows/Pages)(Data Pages)

    part15010,00025400

    Vendor1501,000 2540

    Parven13 15,000300 50

    索引键尺寸每页键数量页面数量

    (Indexes)(Key Size)(Keys/Page)(Leaf Pages)

    part450020

    Vendor45002

    Parven825060

    看起来是个相对简单的3表连接,但是其查询开销是很大的。通过查看系统表可以看到,在part_num上和vendor_num上有簇索引,因此索引是按照物理顺序存放的。parven表没有特定的存放次序。这些表的大小说明从缓冲页中非顺序存取的成功率很小。此语句的优化查询规划是:首先从part中顺序读取400页,然后再对parven表非顺序存取1万次,每次2页(一个索引页、一个数据页),总计2万个磁盘页,最后对vendor表非顺序存取1.5万次,合3万个磁盘页。可以看出在这个索引好的连接上花费的磁盘存取为5.04万次。

    实际上,我们可以通过使用临时表分3个步骤来提高查询效率:

    1.从parven表中按vendor_num的次序读数据:

SELECT part_num,vendor_num,price FROM parven ORDER BY vendor_num INTO temp pv_by_vn

     这个语句顺序读parven(50页),写一个临时表(50页),并排序。假定排序的开销为200页,总共是300页。

    2.把临时表和vendor表连接,把结果输出到一个临时表,并按part_num排序:

SELECT pv_by_vn,* vendor.vendor_num FROM pv_by_vn,vendor WHERE pv_by_vn.vendor_num=vendor.vendor_num ORDER BY pv_by_vn.part_num INTO TMP pvvn_by_pn DROP TABLE pv_by_vn

    这个查询读取pv_by_vn(50页),它通过索引存取vendor表1.5万次,但由于按vendor_num次序排列,实际上只是通过索引顺序地读vendor表(40+2=42页),输出的表每页约95行,共160页。写并存取这些页引发5*160=800次的读写,索引共读写892页。

    3.把输出和part连接得到最后的结果:

SELECT pvvn_by_pn.*,part.part_desc FROM pvvn_by_pn,part WHERE pvvn_by_pn.part_num=part.part_num DROP TABLE pvvn_by_pn

    这样,查询顺序地读pvvn_by_pn(160页),通过索引读part表1.5万次,由于建有索引,所以实际上进行1772次磁盘读写,优化比例为30∶1。笔者在Informix Dynamic

    Sever上做同样的实验,发现在时间耗费上的优化比例为5∶1(如果增加数据量,比例可能会更大)。

    小结

    20%的代码用去了80%的时间,这是程序设计中的一个著名定律,在数据库应用程序中也同样如此。我们的优化要抓住关键问题,对于数据库应用程序来说,重点在于SQL的执行效率。查询优化的重点环节是使得数据库服务器少从磁盘中读数据以及顺序读页而不是非顺序读页。


mysql 发表于:2006.07.17 21:34 ::分类: ( 一般分类 ) ::阅读:(10518次) :: 评论 (5381)
===========================================================
MYSQL数据库初学者使用指南
===========================================================

    有很多朋友虽然安装好了mysql但却不知如何使用它。在这篇文章中我们就从连接MYSQL、修改密码、增加用户等方面来学习一些MYSQL的常用命令。

    一、连接MYSQL

    格式: mysql -h主机地址
    -u用户名
    -p用户密码

    1、例1:连接到本机上的MYSQL。

    首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是:

    mysql>

    2、例2:连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:

    mysql -h110.110.110.110 -uroot -pabcd123
    (注:u与root可以不用加空格,其它也一样)

    3、退出MYSQL命令:

    exit (回车)

    二、修改密码

    格式:mysqladmin -u用户名 -p旧密码 password 新密码

    1、例1:给root加个密码ab12。首先在DOS下进入目录mysqlbin,然后键入以下命令

    mysqladmin -uroot -password ab12

    注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。

    2、例2:再将root的密码改为djg345。

    mysqladmin -uroot -pab12 password djg345

    三、增加新用户(注意:和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符)

    格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码"

    例1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL,然后键入以下命令:

grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";

    但例1增加的用户是十分危险的,你想如某个人知道test1的密码,那么他就可以在internet上的任何一台计算机上登录你的mysql数据库并对你的资料可以为所欲为了,解决办法见例2。

    例2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机),这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。

grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";

    如果你不想test2有密码,可以再打一个命令将密码消掉。

grant select,insert,update,delete on mydb.* to test2@localhost identified by "";

    在上篇我们讲了登录、增加用户、密码更改等问题。下篇我们来看看MYSQL中有关数据库方面的操作。注意:你必须首先登录到MYSQL中,以下操作都是在MYSQL的提示符下进行的,而且每个命令以分号结束。 一、操作技巧 1、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。 2、你可以使用光标上下键调出以前的命令。但以前我用过的一个MYSQL旧版本不支持。我现在用的是:

    mysql-3.23.27-beta-win。

    二、显示命令

    1、显示数据库列表。

    show databases; 

    刚开始时才两个数据库:mysql和test。mysql库很重要它里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。

    2、显示库中的资料表:

     use mysql;//打开库,学过FOXBASE的一定不会陌生吧
    show tables;

    3、显示资料表的结构:

    describe 表名;

    4、建库:

    create database 库名;

    5、建表:

    use 库名;

    create table 表名 (字段设定列表);

    6、删库和删表:

    drop database 库名;

    drop table 表名;

    7、将表中记录清空:

    delete from 表名;

    8、显示表中的记录:

    select * from 表名;

    三、一个建库和建表以及插入数据的实例

drop database if exists school; //如果存在SCHOOL则删除 create database school; //建立库SCHOOL use school; //打开库SCHOOL create table teacher //建立表TEACHER ( id int(3) auto_increment not null primary key, name char(10) not null, address varchar(50) default 深圳, year date ); //建表结束 //以下为插入字段 insert into teacher valuess(,glchengang,深圳一中,1976-10-10); insert into teacher valuess(,jack,深圳一中,1975-12-23);

      注:在建表中(1)将ID设为长度为3的数字字段:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主字段primary key(2)将NAME设为长度为10的字符字段(3)将ADDRESS设为长度50的字符字段,而且缺省值为深圳。varchar和char有什么区别呢,只有等以后的文章再说了。 (4)将YEAR设为日期字段。

    如果你在mysql提示符键入上面的命令也可以,但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql,然后复制到c:下,并在DOS状态进入目录mysqlbin,然后键入以下命令:

    mysql -uroot -p密码 < c:school.sql

    如果成功,空出一行无任何显示;如有错误,会有提示。(以上命令已经调试,你只要将//的注释去掉即可使用)。

    四、将文本资料转到数据库中

    1、文本资料应符合的格式:字段资料之间用tab键隔开,null值用n来代替.

    例:

    3 rose 深圳二中 1976-10-10

    4 mike 深圳一中 1975-12-23

    2、数据传入命令 load data local infile "文件名" into table 表名;

    注意:你最好将文件复制到mysqlbin目录下,并且要先用use命令打表所在的库 。

    五、备份数据库:(命令在DOS的mysqlbin目录下执行)

mysqldump --opt school>school.bbb

    注释:将数据库school备份到school.bbb文件,school.bbb是一个文本文件,文件名任取,打开看看你会有新发现。

    后记:其实MYSQL的对数据库的操作与其它的SQL类数据库大同小异,您最好找本将SQL的书看看。我在这里只介绍一些基本的,其实我也就只懂这些了,呵呵。最好的MYSQL教程还是“晏子“译的“MYSQL中文参考手册“不仅免费每个相关网站都有下载,而且它是最权威的。可惜不是象"PHP4中文手册"那样是chm的格式,在查找函数命令的时候不太方便


mysql 发表于:2006.07.17 21:32 ::分类: ( 一般分类 ) ::阅读:(2600次) :: 评论 (59)
===========================================================
MySQL数据导入导出工具import简介
===========================================================

1).mysqlimport的语法介绍:

mysqlimport位于mysql/bin目录中,是mysql的一个载入(或者说导入)数据的一个非常有效的工具。这是一个命令行工具。有两个参数以及大量的选项可供选择。这个工具把一个文本文件(text file)导入到你指定的数据库和表中。比方说我们要从文件Customers.txt中把数据导入到数据库Meet_A_Geek中的表Custermers中:

mysqlimport Meet_A_Geek Customers.txt

注意:这里Customers.txt是我们要导入数据的文本文件, 而Meet_A_Geek是我们要操作的数据库,数据库中的表名是Customers,这里文本文件的数据格式必须与Customers表中的记录格式一致,否则mysqlimport命令将会出错。 其中表的名字是导入文件的第一个句号(.)前面文件字符串,另外一个例子:

mysqlimport Meet_A_Geek Cus.to.mers.txt

那么我们将把文件中的内容导入到数据库Meet_A_Geek 中的Cus表中。
上面的例子中,都只用到两个参数,并没有用到更多的选项,下面介绍mysqlimport的选项

2).mysqlimport的常用选项介绍:

-d or --delete 新数据导入数据表中之前删除数据数据表中的所有信息
-f or --force 不管是否遇到错误,mysqlimport将强制继续插入数据
-i or --ignore mysqlimport跳过或者忽略那些有相同唯一关键字的行, 导入文件中的数据将被忽略。
-l or -lock-tables 数据被插入之前锁住表,这样就防止了, 你在更新数据库时,用户的查询和更新受到影响。
-r or -replace 这个选项与-i选项的作用相反;此选项将替代表中有相同唯一关键字的记录。
--fields-enclosed- by= char
指定文本文件中数据的记录时以什么括起的, 很多情况下数据以双引号括起。 默认的情况下数据是没有被字符括起的。
--fields-terminated- by=char
指定各个数据的值之间的分隔符,在句号分隔的文件中,分隔符是句号。您可以用此选项指定数据之间的分隔符。默认的分隔符是跳格符(Tab)
--lines-terminated- by=str
此选项指定文本文件中行与行之间数据的分隔字符串 或者字符。 默认的情况下mysqlimport以newline为行分隔符。 您可以选择用一个字符串来替代一个单个的字符: 一个新行或者一个回车。
mysqlimport命令常用的选项还有-v 显示版本(version), -p 提示输入密码(password)等。

3).例子:导入一个以逗号为分隔符的文件

文件中行的记录格式是这样的:

"1", "ORD89876", "1 Dozen Roses", "19991226"

我们的任务是要把这个文件里面的数据导入到数据库Meet_A_Geek中的表格Orders中, 我们使用这个命令:

bin/mysqlimport –prl –fields-enclosed-by=" –fields-terminated-by=, Meet_A_Geek Orders.txt

这个命令可能看起来很不爽,不过当你熟悉了之后,这是非常简单的。第一部分,bin/mysqlimport ,告诉操作系统你要运行的命令是mysql/bin目录下的mysqlimport,选项p是要求输入密码,这样就要求你在改动数据库之前输入密码,操作起来会更安全。 我们用了r选项是因为我们想要把表中的唯一关键字与文件记录中有重复唯一关键字的记录替换成文件中的数据。我们表单中的数据不是最新的,需要用文件中的数据去更新,因而就用r这个选项,替代数据库中已经有的记录。l选项的作用是在我们插入数据的时候锁住表,这样就阻止了用户在我们更新表的时候对表进行查询或者更改的操作。


mysql 发表于:2006.07.17 21:31 ::分类: ( 一般分类 ) ::阅读:(1756次) :: 评论 (17)
===========================================================
用MySQL创建数据库和数据库表
===========================================================

    1、使用SHOW语句找出在服务器上当前存在什么数据库:

mysql> SHOW DATABASES; +----------+ | Database | +----------+ | mysql | | test | +----------+ 3 rows in set (0.00 sec)

     2、创建一个数据库abccs

mysql> CREATE DATABASE abccs;

    注意不同操作系统对大小写的敏感。

    3、选择你所创建的数据库

mysql> USE abccs Database changed

     此时你已经进入你刚才所建立的数据库abccs.

    4、创建一个数据库表

    首先看现在你的数据库中存在什么表: 

mysql> SHOW TABLES; Empty set (0.00 sec)

    说明刚才建立的数据库中还没有数据库表。下面来创建一个数据库表mytable:
    我们要建立一个你公司员工的生日表,表的内容包含员工姓名、性别、出生日期、出生城市。

mysql> CREATE TABLE mytable (name VARCHAR(20), sex CHAR(1), -> birth DATE, birthaddr VARCHAR(20)); Query OK, 0 rows affected (0.00 sec)

    由于name、birthadd的列值是变化的,因此选择VARCHAR,其长度不一定是20。可以选择从1到255的任何长度,如果以后需要改变它的字长,可以使用ALTER TABLE语句。);性别只需一个字符就可以表示:"m"或"f",因此选用CHAR(1);birth列则使用DATE数据类型。

    创建了一个表后,我们可以看看刚才做的结果,用SHOW TABLES显示数据库中有哪些表:

mysql> SHOW TABLES; +---------------------+ | Tables in menagerie | +---------------------+ | mytables | +---------------------+

    5、显示表的结构:

mysql> DESCRIBE mytable; +-------------+-------------+------+----- | Field | Type | Null | Key | Default | Extra | +-------------+-------------+------+-----+ | name | varchar(20) | YES | | NULL | | | sex | char(1) | YES | | NULL | | | birth | date | YES | | NULL | | | deathaddr | varchar(20) | YES | | NULL | | +-------------+-------------+------+-----+- 4 rows in set (0.00 sec)

    6、往表中加入记录

    我们先用SELECT命令来查看表中的数据:

mysql> select * from mytable; Empty set (0.00 sec)

     这说明刚才创建的表还没有记录。

    加入一条新记录: 

mysql> insert into mytable -> values (′abccs′,′f′,′1977-07-07′,′china′); Query OK, 1 row affected (0.05 sec)

    再用上面的SELECT命令看看发生了什么变化。我们可以按此方法一条一条地将所有员工的记录加入到表中。

    7、用文本方式将数据装入一个数据库表

    如果一条一条地输入,很麻烦。我们可以用文本文件的方式将所有记录加入你的数据库表中。创建一个文本文件“mysql.txt”,每行包含一个记录,用定位符(tab)把值分开,并且以在CREATE TABLE语句中列出的列次序给出,例如:

abccs f 1977-07-07 china   mary f 1978-12-12 usa tom m 1970-09-02 usa

    使用下面命令将文本文件“mytable.txt”装载到mytable表中:mysql> LOAD DATA LOCAL INFILE "mytable.txt" INTO TABLE pet;

    再使用如下命令看看是否已将数据输入到数据库表中:mysql> select * from mytable;
   


mysql 发表于:2006.07.17 21:29 ::分类: ( 一般分类 ) ::阅读:(1538次) :: 评论 (5)
===========================================================
如何从MySQL数据库表中检索数据
===========================================================

    1、从数据库表中检索信息

    实际上,前面我们已经用到了SELECT语句,它用来从数据库表中检索信息。
    select语句格式一般为:
    SELECT 检索关键词 FROM 被检索的表 WHERE 检索条件(可选)
    以前所使用的“ * ”表示选择所有的列。
    下面继续使用我们在上篇文章中创建的表mytable。

    2、查询所有数据:

mysql> select * from mytable; +----------+------+------------+----------+ | name | sex | birth | birthaddr | +----------+------+------------+--------+ | abccs |f | 1977-07-07 | china | | mary |f | 1978-12-12 | usa | | tom |m | 1970-09-02 | usa | +----------+------+------------+----------+ 3 row in set (0.00 sec)

    3、修正错误记录:

    假如tom的出生日期有错误,应该是1973-09-02,则可以用update语句来修正: mysql> update mytable set birth = "1973-09-02" where name = "tom";
    再用2中的语句看看是否已更正过来。

    4、选择特定行

    上面修改了tom的出生日期,我们可以选择tom这一行来看看是否已经有了变化:

mysql> select * from mytable where name = "tom"; +--------+------+------------+------------+ | name |sex | birth | birthaddr | +--------+------+------------+------------+ | tom |m | 1973-09-02 | usa | +--------+------+------------+------------+ 1 row in set (0.06 sec)

    上面WHERE的参数指定了检索条件。我们还可以用组合条件来进行查询:

mysql> SELECT * FROM mytable WHERE sex = "f" AND birthaddr = "china"; +--------+------+------------+------------+ | name |sex | birth | birthaddr | +--------+------+------------+------------+ | abccs |f | 1977-07-07 | china | +--------+------+------------+------------+ 1 row in set (0.06 sec)

    5、选择特定列

    假如你想查看表中的所有人的姓名,则可以这样操作:

mysql> SELECT name FROM mytable; +----------+ | name | +----------+ | abccs | | mary | | tom | +----------+ 3 row in set (0.00 sec)

    如果想列出姓名和性别两列,则可以用逗号将关键词name和birth分开: myaql> select name,birth from mytable;

    6、对行进行排序

    我们可以对表中的记录按生日大小进行排序:

mysql> SELECT name, birth FROM mytable ORDER BY birth; +----------+------------+ | name | birth | +----------+------------+ | tom | 1973-09-02 | | abccs | 1977-07-07 | | mary | 1978-12-12 | +----------+------------+ 3 row in set (0.00 sec)

     我们可以用DESC来进行逆序排序:

mysql> SELECT name, birth FROM mytable ORDER BY birth DESC; +----------+------------+ | name | birth | +----------+------------+ | mary | 1978-12-12 | | abccs | 1977-07-07 | | tom | 1973-09-02 | +----------+------------+ 3 row in set (0.00 sec)

     7、行计数

    数据库经常要统计一些数据,如表中员工的数目,我们就要用到行计数函数COUNT()。COUNT()函数用于对非NULL结果的记录进行计数:

mysql> SELECT COUNT(*) FROM mytable; +----------+ | COUNT(*) | +----------+ | 3 | +----------+ 1 row in set (0.06 sec) 员工中男女数量: mysql> SELECT sex, COUNT(*) FROM mytable GROUP BY sex; +------+----------+ | sex | COUNT(*) | +------+----------+ | f | 2 | | m | 1 | +------+----------+ 2 row in set (0.00 sec)

     注意我们使用了GROUP BY对SEX进行了分组。


mysql 发表于:2006.07.17 21:28 ::分类: ( 一般分类 ) ::阅读:(999次) :: 评论 (2)
===========================================================
如何安装并测试MySQL
===========================================================

    PHP+MySQL+Linux目前已逐渐成为小型web服务器的一种经典组合。在Windows环境下构筑和调试MySQL数据库是许多网站开发者的一种首选。本人在Windows98环境下初学MySQL,现将学习过程与经验总结出来供大家参考。
    1、下载mysql-3.23.35-win.zip并解压;
    2、运行setup.exe;选择d:mysql,"tyical install"
    3、启动mysql,有如下方法:

    方法一:使用winmysqladmin

    1)、进入d::mysqlbin目录,运行winmysqladmin.exe,在屏幕右下角的任务栏内会有一个带红色的图符
    2)、鼠标左键点击该图符,选择“show me”,出现“WinMySQLAdmin”操作界面;首次运行时会中间会出现一个对话框要求输入并设置你的用户名和口令
    3)、选择“My.INI setup”
    4)、在“mysqld file”中选择“mysqld-opt”(win9x)或“mysqld-nt”(winNT)
    5)、选择“Pick-up or Edit my.ini values”可以在右边窗口内对你的my.ini文件进行编辑
    6)、选择“Save Modification”保存你的my.ini文件
    7)、如果你想快速使用winmysqladmin(开机时自动运行),选择“Create ShortCut on Start Menu”
    8)、测试:
    进入DOS界面;
    在d:mysqlbin目录下运行mysql,进入mysql交互操作界面
    输入show databases并回车,屏幕显示出当前已有的两个数据库mysql和test

    方法二:不使用winmysqladmin

    1)、在DOS窗口下,进入d:/mysql/bin目录
    2)、win9X下)运行:
    mysqld
    在NT下运行:
    mysqld-nt --standalone
    3)、此后,mysql在后台运行
    4)、测试mysql:(在d:/mysql/bin目录下)
    a)、mysqlshow 正常时显示已有的两个数据库mysql和test
    b)、mysqlshow -u root mysql 正常时显示数据库mysql里的五个表:columns_priv,db,host,tables_priv,user 
    c)、mysqladmin version status proc 显示版本号、状态、进程信息等
    d)、mysql test 进入mysql操作界面,当前数据库为test
    5)、mysql关闭方法: mysqladmin -u root shutdown
    4、至此,MySQL已成功安装,接着可以熟悉MySQL的常用命令并创建自己的数据库了。


mysql 发表于:2006.07.17 21:26 ::分类: ( 一般分类 ) ::阅读:(1384次) :: 评论 (7)
===========================================================
用MySQL内建复制功能来优化可用性
===========================================================

    在Soundbreak我们每天24小时不间断地播放实况音频和视频,所以对于MySQL的新增的复制特性,我们不能做出很令人信服的测试。通过测试我们发现,可以使用这个特性来与备份数据库服务器保持数据同步,这样当主服务器因为某种原因处理失效时,能够使用备份机处理所有的查询。对于这样的要求,配置两台服务器并不困难。我将详细讨论整个处理过程,同时讨论一下当主服务器失效时,如何使用PHP来重定向查询。

    MySQL内部复制功能是建立在两个或两个以上服务器之间,通过设定它们之间的主-从关系来实现的。其中一个作为主服务器,其它的作为从服务器。我将详细讨论如何配置两台服务器,将一个设为主服务器,另一个设为从服务器。并且描述一下在它们之间进行切换的处理过程。我是在MySQL的3.23.23版本上进行的配置设置过程,并且也是在这个版本上进行的测试。MySQL开发人员建议最好使用最新版本,并且主-从服务器均使用相同的版本。同时MySQL 3.23版本仍然是beta测试版,而且这个版本可能不能向下兼容。所以因为这个原因,在实际的网站中,我现在还没有使用这个版本。拥有容错能力具有一个好处是,在不需中断任何查询的情况下,对服务器进行升级。

    第一步:配置主服务器
    在这篇文章的剩下篇幅中,我将指定两台服务器。A(IP为10.1.1.1)作为主服务器(简称为主机)。B(IP为10.1.1.2)作为后备服务器(简称为备机)。

    MySQL的复制功能的实现过程为:备机(B)与主机(A)连接,然后读出主机的二进制更新日志,再将发生的变化合并到自已的数据库中。备机需要一个用户帐号来与主机连接,所以在主机上创建一个帐号,并只给它FILE权限,如下操作:

GRANT FILE ON *.* TO replicate@10.1.1.2 IDENTIFIED BY 'password';

    为了备机能够与主机连接,要在主机上运行'FLUSH PRIVILEGES',不过不要担心,因为我们将在下面的步骤中停掉服务器。

    现在我们需要主机数据库的一个快照,并且对主机进行配置,允许生成二进制的更新日志。首先编辑'my.cnf'文件,以便允许二进制更新日志,所以在[mysqld]部分的下面某个地方增加一行:'log-bin'。在下一次服务器启动时,主机将生成二进制更新日志(名为:<主机名>-bin.<增量序号#>)。为了让二进制更新日志有效,关闭MySQL服务程序,然后将主机上的所有数据库目录到另一个目录中,接着重新启动mysqld。
    请确定得到了所有数据库,否则在进行复制时,如果一个表在主机上存在但在备机上不存在,将因为出错而退出。现在你已经得到了数据的快照,和一个从建立快照以来的二进制日志,上面记录着任何对数据库的修改。请注意MySQL数据文件(*.MYD,*.MYI和*.frm)是依赖于文件系统的,所以你不能仅仅进行文件传输,如从Solaris到Linux。如果你处于一个异种的服务器环境,你将不得不使用mysqldump实用程序或其它的定制脚本来得到数据快照。

    第二步:配置备机
    让我们继续。停掉备机上的MySQL服务程序,并且把从主机上拷贝来的数据库目录移到备机上的data目录下。请确认将目录的拥有者和属组改变为MySQL用户相应值,并且修改文件模式为660(只对拥有者和属组可读、可写),目录本身为770(只对拥有者和属组可读、可写和可执行)。

    继续。在备机上启动MySQL服务程序,确认MySQL工作正常。运行几个select查询(不要update或insert查询),看一看在第一步中得到的数据快照是否成功。接着,在测试成功后关掉MySQL服务程序。

    在备机上配置需要访问的主机,以便接收主机的更改。所以需要编辑务机上的'my.cnf'文件,在[mysqld]部分中增加下面几行:

    master-host=10.1.1.1
    master-user=replicate
    master-password=password

    在启动备机服务程序后,备机服务程序将查看在'my.cnf'文件中所指定的主机,查看是否有改变,并且将这些改变合并到自已的数据库中。备机保持了主机的更新记录,这些记录是从主机的'master.info'文件中接收下来的。备机线程的状态可以通过sql命令'SHOW SLAVE-STATUS'看到。在备机上处理二进制日志中如果
    发生错误,都将导致备机线程的退出,并且在*.err的日志文件中生成一条信息。然后错误可以被改正,接着可以使用sql语句'SLAVE START'来重新启动备机线程。线程将从主机二进制日志处理中断的地方继续处理。

    至此,在主机上所发生的数据改变应该已经复制到备机上了,要测试它,你可以在主机上插入或更新一条记录,而在备机上选择这条记录。

    现在我们拥有了从A机到B机的这种主-从关系,这样当A机可能当机的时候,允许我们将所有的查询重定向到B机上去,但是当A机恢复时,我们没有办法将发生的改变恢复到A机中去。为了解决这个问题,我们创建从B机到A机的主-从关系。

    第三步:创建相互的主从关系
    首先在B机上的my.cnf文件中,在[mysqld]部分中加入'log-bin',接着重新启动mysqld,然后创建可在
    它的上面执行复制功能的用户帐号,使用:

GRANT FILE ON *.* TO replicate@10.1.1.1 IDENTIFIED BY 'password';

    在B机上运行'FLUSH PRIVILEGES'命令,以便装入在加入复制用户后的新的授权表,接着回到A机上,在
    它的'my.cnf'中加入下面几行:

master-host=10.1.1.2 master-user=replicate master-password=password

    在重启A机的服务程序之后,现在我们一拥有了在A机与B机之间的相互主-从关系。不管在哪个服务器上 更新一条记录或插入一条记录,都将被复制到另一台服务器上。要注意的是:我不敢确定一个备机合并二进 制日志变化的速度有多快,所以用这种方法来进行插入或更新语句的负载平衡可能不是一个好办法。

    第四步:修改你的数据库连接程序 既然你已经在A机和B机之间建立了一个相互的关系,你需要修改数据库连接程序,以便从这种方式中得 到好处。下面的函数首先试图与A机连接,如果不能建立连接则与B机连接。

********************************************************function db_connect()returns a link identifier on success, or false on error ******************************************************** function db_connect(){ $username = "replUser";$password = "password"; $primary = "10.1.1.1";$backup = "10.1.1.2";# attempt connection to primary if(!$link_id = @mysql_connect($primary, $username, $password)) # attempt connection to secondary$link_id = @mysql_connect($secondary, $username, $password) return $link_id; }

    我在两种情况下对使用了上面技术的数据库连接建立过程进行了测试,一种是主MySQL服务程序关闭了, 但是服务器还在运行,另一种情况是主服务器关闭了。如果只是mysqld关闭了,连接会马上转向备机;但是 如果整个服务器关闭了,就出现了无限地等待(两分钟后我放弃了跟踪 -- 很短的注意跨度),因为PHP在查 找一个不存在的服务器。不幸地是,不象fsockopen函数,mysql_connect函数没有一个超时参数,然而我们 可以使用fsockopen来模拟一个超时处理。

    第五步:一个改进的数据库连接程序

********************************************************function db_connect_plus()returns a link identifier on success, or false on error ********************************************************function db_connect_plus(){$username = "username";$password = "password"; $primary = "10.1.1.1";$backup = "10.1.1.2"; $timeout = 15; // timeout in secondsif($fp = fsockopen($primary, 3306, &$errno, &$errstr, $timeout)){ fclose($fp); return$link = mysql_connect($primary, $username, $password); }if($fp = fsockopen($secondary, 3306, &$errno, &$errstr, $timeout)){ fclose($fp); return$link = mysql_connect($secondary, $username, $password); }return 0; }

    这个新改进的函数向我们提供了一个可调的超时特性,这正是mysql_connect函数所缺少的。如果连接 立即失败,这种情况如机器"活"着,但mysqld"当"掉了,函数立即移到第二个服务器。上面的函数相当健壮, 在试图进行连接之前先测试一下,查看服务程序是否在指定端口进行监听,让你的脚本在一段可接受的时间 段后超时,允许你适当地对出错情况进行处理。如果你修改了缺省端口3306,请保证对端口号进行修改。

    结论和意见 首先,要确定得到了一个完整的数据快照。如果忘记拷贝一个表或数据库将导致备机线程序停止。生成 快照的时刻是很关健的。你应该确保在拷贝数据文件之前二进制日志功能是无效的。如果在得到快照之前就 允许了二进制日志功能,备机的线程可能会停止,原因就是当线程试图导入重要的记录时,可能会由于主键 重复而停止。最好就是接照第二部分所讨论的处理办法来做:关闭-拷贝-允许二进制日志功能重启。

    你可能想要按照最初的一种方式来配制复制处理,并且在合适的时间关注备机,确保备机与主机保持同 步。

    我没有测试过一个使用了复制特性的系统的负载平衡处理性能,但是我会灵活地使用这样系统来平衡插 入和更新。例如,如果在两台服务器上两条记录都给出了同一个auto_increment值,这种情况备机线程会在 哪一条记录上停掉呢?象这样的问题将会让负载平衡作为只读的处理,一台服务器处理所有的插入和更新, 同时一组备机(是的,你可以有多个与主机分离的备机)处理所有的选择。

    我非常高兴,MySQL已经具备了复制系统的某些功能,并且配置很简单。使用它,你就可以开始针对失 控的事件提供额外的安全措施了。我仅仅涉及了复制特性,这个我已经测试并且使用了,但是在MySQL的在 线文档中的第11部分有中更详细的说明。


mysql 发表于:2006.07.17 21:23 ::分类: ( 一般分类 ) ::阅读:(939次) :: 评论 (2)
===========================================================
Mysql中的临时表使用方法讲解
===========================================================

当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后多这些表运行查询。

创建临时表很容易,给正常的CREATE TABLE语句加上TEMPORARY关键字:

CREATE TEMPORARY TABLE tmp_table ( name VARCHAR(10) NOT NULL, value INTEGER NOT NULL )

临时表将在你连接MySQL期间存在。当你断开时,MySQL将自动删除表并释放所用的空间。当然你可以在仍然连接的时候删除表并释放空间。

DROP TABLE tmp_table

如果在你创建名为tmp_table临时表时名为tmp_table的表在数据库中已经存在,临时表将有必要屏蔽(隐藏)非临时表tmp_table。

如果你声明临时表是一个HEAP表,MySQL也允许你指定在内存中创建它:

CREATE TEMPORARY TABLE tmp_table ( name VARCHAR(10) NOT NULL, value INTEGER NOT NULL ) TYPE = HEAP

 因为HEAP表存储在内存中,你对它运行的查询可能比磁盘上的临时表快些。然而,HEAP表与一般的表有些不同,且有自身的限制。详见MySQL参考手册。

正如前面的建议,你应该测试临时表看看它们是否真的比对大量数据库运行查询快。如果数据很好地索引,临时表可能一点不快。


mysql 发表于:2006.07.17 21:22 ::分类: ( 一般分类 ) ::阅读:(953次) :: 评论 (6)
===========================================================
MySQL多表操作和备份处理
===========================================================

    多表操作

    在一个数据库中,可能存在多个表,这些表都是相互关联的。我们继续使用前面的例子。前面建立的表中包含了员工的一些基本信息,如姓名、性别、出生日期、出生地。我们再创建一个表,该表用于描述员工所发表的文章,内容包括作者姓名、文章标题、发表日期。

    1、查看第一个表mytable的内容:

mysql> select * from mytable; +----------+------+------------+-----------+ | name | sex | birth | birthaddr | +----------+------+------------+-----------+ | abccs |f | 1977-07-07 | china | | mary |f | 1978-12-12 | usa | | tom |m | 1970-09-02 | usa | +----------+------+------------+-----------+

    2、创建第二个表title(包括作者、文章标题、发表日期):

mysql> create table title(writer varchar(20) not null, -> title varchar(40) not null, -> senddate date); &nbsp;&nbsp;&nbsp;&nbsp;向该表中填加记录,最后表的内容如下: <ccid_nobr> <table width="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"> <tr> <td bgcolor="e6e6e6" class="code" style="font-size:9pt"> <pre><ccid_code> mysql> select * from title; +--------+-------+------------+ | writer | title | senddate | +--------+-------+------------+ | abccs | a1 | 2000-01-23 | | mary | b1 | 1998-03-21 | | abccs | a2 | 2000-12-04 | | tom | c1 | 1992-05-16 | | tom | c2 | 1999-12-12 | +--------+-------+------------+ 5 rows in set (0.00sec)

   3、多表查询

    现在我们有了两个表: mytable 和 title。利用这两个表我们可以进行组合查询:
    例如我们要查询作者abccs的姓名、性别、文章:

mysql> SELECT name,sex,title FROM mytable,title -> WHERE name=writer AND name=′abccs′; +-------+------+-------+ | name | sex | title | +-------+------+-------+ | abccs | f | a1 | | abccs | f | a2 | +-------+------+-------+

   上面例子中,由于作者姓名、性别、文章记录在两个不同表内,因此必须使用组合来进行查询。必须要指定一个表中的记录如何与其它表中的记录进行匹配。

    注意:如果第二个表title中的writer列也取名为name(与mytable表中的name列相同)而不是writer时,就必须用mytable.name和title.name表示,以示区别。

    再举一个例子,用于查询文章a2的作者、出生地和出生日期: 

mysql> select title,writer,birthaddr,birth from mytable,title -> where mytable.name=title.writer and title=′a2′; +-------+--------+-----------+------------+ | title | writer | birthaddr | birth | +-------+--------+-----------+------------+ | a2 | abccs | china | 1977-07-07 | +-------+--------+-----------+------------+

    修改和备份、批处理

    有时我们要对数据库表和数据库进行修改和删除,可以用如下方法实现:

    1、增加一列:
    如在前面例子中的mytable表中增加一列表示是否单身single:
    mysql> alter table mytable add column single char(1);

    2、修改记录
    将abccs的single记录修改为“y”:
    mysql> update mytable set single=′y′ where name=′abccs′; 现在来看看发生了什么:

mysql> select * from mytable; +----------+------+------------+-----------+--------+ | name | sex | birth | birthaddr | single | +----------+------+------------+-----------+--------+ | abccs |f | 1977-07-07 | china | y | | mary |f | 1978-12-12 | usa | NULL | | tom |m | 1970-09-02 | usa | NULL | +----------+------+------------+-----------+--------+

    3、增加记录
    前面已经讲过如何增加一条记录,为便于查看,重复与此:

mysql> insert into mytable -> values (′abc′,′f′,′1966-08-17′,′china′,′n′); Query OK, 1 row affected (0.05 sec)

    查看一下:

mysql> select * from mytable; +----------+------+------------+-----------+--------+ | name | sex | birth | birthaddr | single | +----------+------+------------+-----------+--------+ | abccs |f | 1977-07-07 | china | y | | mary |f | 1978-12-12 | usa | NULL | | tom |m | 1970-09-02 | usa | NULL | | abc |f | 1966-08-17 | china | n | +----------+------+------------+-----------+--------+

    4、删除记录
    用如下命令删除表中的一条记录:mysql> delete from mytable where name=′abc′;
    DELETE从表中删除满足由where给出的条件的一条记录。
    再显示一下结果:

mysql> select * from mytable; +----------+------+------------+-----------+--------+ | name | sex | birth | birthaddr | single | +----------+------+------------+-----------+--------+ | abccs |f | 1977-07-07 | china | y | | mary |f | 1978-12-12 | usa | NULL | | tom |m | 1970-09-02 | usa | NULL | +----------+------+------------+-----------+--------+

   5、删除表:
    mysql> drop table ****(表1的名字),***表2的名字;
    可以删除一个或多个表,小心使用。

    6、数据库的删除:
    mysql> drop database 数据库名;
    小心使用。

    7、数据库的备份:
    退回到DOS:
    mysql> quit
    d:mysqlbin

    使用如下命令对数据库abccs进行备份:
    mysqldump --opt abccs>abccs.dbb
    abccs.dbb就是你的数据库abccs的备份文件。

    8、用批处理方式使用MySQL:

    首先建立一个批处理文件mytest.sql,内容如下:

use abccs; select * from mytable; select name,sex from mytable where name=′abccs′;

    在DOS下运行如下命令:d:mysqlbin mysql < mytest.sql

    在屏幕上会显示执行结果。

    如果想看结果,而输出结果很多,则可以用这样的命令: mysql < mytest.sql | more

    我们还可以将结果输出到一个文件中: mysql < mytest.sql > mytest.out


mysql 发表于:2006.07.17 21:19 ::分类: ( 一般分类 ) ::阅读:(969次) :: 评论 (1)
===========================================================
MySQL中修改密码及访问限制设置详解
===========================================================

    MySQL是一个真正的多用户、多线程SQL数据库服务器。MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和很多不同的客户程序和库组成。由于其源码的开放性及稳定性,且与网站流行编 挥镅 PHP的完美结合,现在很多站点都利用其当作后端数据库,使其获得了广泛应用。处于安全方面的考虑,需要为每一用户赋于对不同数据库的访问限制,以满足不同用户的要求。下面就分别讨论,供大家参考。

    一、MySQL修改密码方法总结

    首先要说明一点的是:一般情况下,修改MySQL密码是需要有mysql里的root权限的,这样一般用户是无法更改密码的,除非请求管理员帮助修改。

    方法一

    使用phpMyAdmin

    (图形化管理MySql数据库的工具),这是最简单的,直接用SQL语句修改mysql数据库库的user表,不过别忘了使用PASSWORD函数,插入用户用Insert命令,修改用户用Update命令,删除用Delete命令。在本节后面有数据表user字段的详细介绍。

    方法二

    使用mysqladmin。输入

mysqladmin -u root -p oldpassword newpasswd

    执行这个命令后,需要输入root的原密码,这样root的密码将改为newpasswd。同样,把命令里的root改为你的用户名,你就可以改你自己的密码了。

    当然如果你的mysqladmin连接不上mysql server,或者你没有办法执行mysqladmin,那么这种方法就是无效的,而且mysqladmin无法把密码清空。

    下面的方法都在mysql提示符下使用,且必须有mysql的root权限:

    方法三

mysql> INSERT INTO mysql.user (Host,User,Password) VALUES('%','system', PASSWORD('manager'));mysql> FLUSH PRIVILEGES

    确切地说这是在增加一个用户,用户名为system,密码为manager。注意要使用PASSWORD函数,然后还要使用FLUSH PRIVILEGES来执行确认。

    方法四

    和方法三一样,只是使用了REPLACE语句

mysql> REPLACE INTO mysql.user (Host,User,Password)VALUES('%','system',PASSWORD('manager'));mysql> FLUSH PRIVILEGES

    方法五

    使用SET PASSWORD语句

mysql> SET PASSWORD FOR system@"%" = PASSWORD('manager');

    你也必须使用PASSWORD()函数,但是不需要使用FLUSH PRIVILEGES来执行确认。

    方法六

    使用GRANT ... IDENTIFIED BY语句,来进行授权。

mysql> GRANT USAGE ON *.* TO system@"%" IDENTIFIED BY 'manager';

    这里PASSWORD()函数是不必要的,也不需要使用FLUSH PRIVILEGES来执行确认。

    注:PASSWORD()函数作用是为口令字加密,在程序中MySql自动解释。  

    二、MySql中访问限制的设置方法

    我们采用两种方法来设置用户。

    进入到Mysql执行目录下(通常是c:mysqlbin)。输入mysqld-shareware.exe,输入mysql--user=root mysql ,不然不能添加新用户。进入到mysql>提示符下进行操作。

    假设我们要建立一个超级用户,用户名为system,用户口令为manager。  

    方法一  

    用Grant 命令授权,输入的代码如下:

mysql>GRANT ALL PRIVILEGES ON *.* TO system@localhost IDENTIFIED BY 'manager' WITH GRANT OPTION;

    应显示:Query OK, 0 rows affected (0.38 sec)

    方法二

    对用户的每一项权限进行设置:

mysql>INSERT INTO user VALUES('localhost','system',PASSWORD('manager'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');

    对于3.22.34版本的MySQL,这里共14个"Y",其相应的权限如下(按字段顺序排列):

权限 表列名称 相应解释 使用范围 select Select_priv 只有在真正从一个表中检索时才需要select权限 表 insert Insert_priv 允许您把新行插入到一个存在的表中 表 update Update_priv 允许你用新值更新现存表中行的列 表 delete Delete_priv 允许你删除满足条件的行 表 create Create_priv 允许你创建新的数据库和表 >数据库、表或索引 drop Drop_priv 抛弃(删除)现存的数据库和表 数据库或表 reload Reload_priv 允许您告诉服务器再读入授权表 服务器管理 shutdown Shutdown_priv 可能被滥用(通过终止服务器拒绝为其他用户服务) 服务器管理 process Process_priv 允许您察看当前执行的查询的普通文本,包括设定或改变口令查询 服务器管理 file File_priv 权限可以被滥用在服务器上读取任何可读的文件到数据库表 服务器上的文件存取 grant Grant_priv 允许你把你自己拥有的那些权限授给其他的用户 数据库>或表 references References_priv 允许你打开和关闭记录文件 数据库或表 index Index_priv 允许你创建或抛弃(删除)索引 表 alter Alter_priv 允许您改变表格,可以用于通过重新命名表来推翻权限系统 表

    如果创建用户时只有select、insert、update和delete权限,则允许用户只能在一个数据库现有的表上实施操作.

    下面就可以创建我们要用到的数据库了,我们直接输入. 例:我们要创建数据库名为XinXiKu,可用如下代码:  

mysql>create database XinXiKu;

    应显示:Query OK, 1 row affected (0.00 sec)


mysql 发表于:2006.07.17 21:17 ::分类: ( 一般分类 ) ::阅读:(1094次) :: 评论 (3)
===========================================================
在服务器上安装使用MySQL的注意事项
===========================================================

    一、怎么样取得最新版本的MySQL?

    要安装MySQL,首先要当然要取得它的最新版本,虽然大家都知道在FreeBSD的Packages中可以找到MySQL,但是我还是建议大家到网络上去找最新版本的MySQL。我介绍大家到http://www.mysql.org去下载,这里的最新版本是MySQL 3.23 versions 。

    二、安装MySQL时候的注意事项?

    1、如果您是用MySQL+Apache,使用的又是FreeBSD网路操作系统的话,安装时候你应按注意到FreeBSD的版本问题,在FreeBSD的3.0以下版本来说,MySQL Source内含的MIT-pthread运行是正常的,但在这版本以上,你必须使用
    native threads,也就是加入一个with-named-thread-libs=-lc_r的选项。
    2、如果您在COMPILE过程中出了问题,请先检查你的gcc版本是否在2.81版本以上,gmake版本是否在3.75以上。
    3、如果不是版本的问题,那可能是你的内存不足,请使用./configure -- with-low-memory来加入。
    4、如果您要重新做你的configure,那么你可以键入rm config.cache和make clean来清除记录。
    5、我们一般把MySQL安装在/usr/local目录下,这是缺省值,您也可以按照你的需要设定你所安装的目录。

    三、启动和停止MySQL

    如果你的机器上从未安装过MySQL的话,在安装MySQL时,最后一个键入的命令是/usr/local/mysql-3.23X/scripts/mysql_install_db 如果你是同时安装多台机器的话,你可以编辑一下这档案,这样一来可以使你方便的设置好每一台的权限。

    1、在安装目录/usr/local启动mysql可以使用/usr/local/share/mysql/mysql.server start记得把mysql.server的属性设置成777
    2、要停止mysql daemon可以使用/usr/local/bin/mysqladmin shutdown来实现
    3、如果你的mysql已经设置了密码,你必须使用mysqladmin -u root -p shutdown来实现

    四、用root建一个MYSQL的使用者

    你需要先用root登入机器,然后改变目录存取权限chown -R mysql /usr/local/var,接着修改mysql.server 档案,这文件位于/usr/local/share/mysql/下,把mysql_daemon_user=root改成mysql_daemon_user=mysql。但是在以后新增资料库之后,记得把你的相关档案存取权限改过去:chown -R mysql /usr/local/var/some_new_dbs,如果你希望你的电脑启动时候自动加载mysql,你只要在/etc/rc.local加入一行/usr/local/mysql/share.server start

    五、测试你的mysql

    启动mysql后,你可以使用ps -aux来测试,你就发现多了两个process MYSQL使用的语法概观字符串类型---STRINGS 字符串的匹配必须是成对的,例如:

    ‘MY IS OCP’
    “MY IS OCPISCAI”

    他们必须是是用‘’或“”来表示!

    我们来举一些在字符串里面含有单引号和双引号的例子,例如:

    重复双引号:

    mysql>select “ hi! “ “ocp” “!” ->hi!”ocp”!

    因为我们的HTML网络里含有许多的单引号和双引号,所以程序在这里会遇到些因为单引号和双引号而出错的问题,所以要加以小心。

    数字类型---NUMBERS

    我们来看一些合法的数字表达方式:

    7
    777 
    -777 
    77.77 
    77.777 
    -777.7777o+7

    资料库的命名问题,TATBLE、INDEX、COLUMN、以及ALIAS NAME 的命名原则数字可以做为字首,可以有底线,但是不能完全是数字。尽可能的避免使用$字符,在MYSQL里$字符是完全合法的,不过就是会和PHP混淆,所以尽量不使用的好。在命名里不能有“.”字符。ALIAS NAME可以使用256个字符,其它的长度一般都限制在60个字符内。你可以根据你的需要自己修改MYSQL_INSTALL_DB把你所需要修改的长度改一改,改的时候注意别改的太过夸张,MYSQL资料库是可以支持,但MYSQL的核心我没有试过,也许会出现错误。

    数值函数:在数值函数出错的时候,传回的都是NULL

    LOG10(X) :以10为底的LOG值
     EXP(X):传回E的X次方,其中E是NATURAL LOG 的底数。
    FLOOR(X):传回小于等于X的最大整数。 
    CEILING(X):传回大雨等于X的最小整数。 
    ROUND(X):四舍五入到整数。 
    MOD(N,M) 或者 % :取N除以M的余数。 
    SIGN(X):X大于传回1,X等于0传回0,X小于0传回-1。 
    ABS(X):取绝对值。 
    ROUND(X,D):四舍五入到D位小数。D等于0则与ROUND(X)相同。

    三角函数:

    ATAN(X,Y):反三角函数 
    ATAN2(X,Y):反三角函数 
    LEAST(X,Y,。。。):至少两个参数,传回最小值。 
    GREATEST(X,Y,。。。):至少两个参数,传回最大值。
    DEGREES(X):转换弧度(RADIAN)到度数。 
    RADIANS(X):转换度数到弧度。


mysql 发表于:2006.07.17 21:15 ::分类: ( 一般分类 ) ::阅读:(1416次) :: 评论 (7)
===========================================================
MySQL中文排序错误的解决方法
===========================================================

在MySQL中,进行中文排序和查找的时候,对汉字的排序和查找结果是错误的。这种情况在MySQL的很多版本中都存在。如果这个问题不解决,那么MySQL将无法实际处理中文。

    出现这个问题的原因是:MySQL在查询字符串时是大小写不敏感的,在编绎MySQL时一般以ISO-8859字符集作为默认的字符集,因此在比较过程中中文编码字符大小写转换造成了这种现象。

    一种解决方法是对于包含中文的字段加上&quot;binary&quot;属性,使之作为二进制比较,例如将&quot;name char(10)&quot;改成&quot;name char(10)binary&quot;。

    二种解决方法是如果你使用源码编译MySQL,可以编译MySQL时使用--with--charset=gbk 参数,这样MySQL就会直接支持中文查找和排序了。


mysql 发表于:2006.07.17 15:09 ::分类: ( 一般分类 ) ::阅读:(1188次) :: 评论 (11)
切换风格
新闻聚合
博客日历
文章归档...
最新发表...
博客统计...
网站链接...
原创粉丝点击