??xml version="1.0" encoding="utf-8" standalone="yes"?>国产午夜福利精品久久2021,2021国产精品午夜久久,亚洲色欲久久久综合网东京热http://www.shnenglu.com/guojingjia2006/category/11422.htmlPay it forword - 我ƈ不觉的自豪,我所试的事情都p|了······习惯原本生zȝZҎ改变Q就现状很p,他们也很难改变,在过E中Q他们还是放弃了······他们一攑ּQ大家就都是输家······让爱传出去,很困难,也无法预料,Z需要更l心的观察别人,要随时注意才能保护别人,因ؓ他们未必知道自己要什么····?/description>zh-cnFri, 12 Jul 2013 09:58:15 GMTFri, 12 Jul 2013 09:58:15 GMT60mysql配置文gmy.cnf详解[部分]http://www.shnenglu.com/guojingjia2006/archive/2013/07/12/201716.html果?/dc:creator>果?/author>Fri, 12 Jul 2013 01:16:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2013/07/12/201716.htmlhttp://www.shnenglu.com/guojingjia2006/comments/201716.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2013/07/12/201716.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/201716.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/201716.html
basedir = path 使用l定目录作ؓ根目?安装目录)?/span>
character-sets-dir = path l出存放着字符集的目录?/span>
datadir = path 从给定目录读取数据库文g?/span>
pid-file = filename 为mysqldE序指定一个存放进EID的文?仅适用于UNIX/Linuxpȝ); Init-V脚本需要用这个文仉的进EIDl束mysqldq程?/span>
socket = filename 为MySQL客户E序与服务器之间的本地通信指定一个套接字文g(仅适用?UNIX/Linuxpȝ; 默认讄一般是/var/lib/mysql/mysql.sock文g)。在Windows环境下,如果MySQL客户与服务器是通过命名道q行通信 的,–sock选项l出的将是该命名道的名?默认讄是MySQL)?/span>
lower_case_table_name = 1/0 新目录和数据表的名字是否只允怋用小写字? q个选项在Windows环境下的默认讄?(只允怋用小写字??/span>

 

mysqldE序Q语a讄

character-sets-server = name 新数据库或数据表的默认字W集。ؓ了与MySQL的早期版本保持兼容,q个字符集也可以?#8211;default-character-set选项l出; 但这个选项已经昑־有点q时了?/span>
collation-server = name 新数据库或数据表的默认排序方式?/span>
lanuage = name 用指定的语言昄出错信息?/span>

 

mysqldE序Q通信、网l、信息安?/strong>

enable-named-pipes 允许Windows 2000/XP环境下的客户和服务器使用命名道(named pipe)q行通信。这个命名管道的默认名字是MySQLQ但可以?#8211;socket选项来改变?/span>
local-infile [=0] 允许/止使用LOAD DATA LOCAL语句来处理本地文件?/span>
myisam-recover [=opt1, opt2, ...] 在启动时自动修复所有受损的MyISAM数据表。这个选项的可取值有4U?DEFAULT、BACKUP、QUICK和FORCE; 它们与myisamchkE序的同名选项作用相同?/span>
old-passwords 使用MySQL 3.23?.0版本中的老算法来加密mysql数据库里的密?默认使用MySQL 4.1版本开始引入的新加密算??/span>
port = n 为MySQLE序指定一个TCP/IP通信端口(通常?306端口)?/span>
safe-user-create 只有在mysql.user数据库表上拥有INSERT权限的用h能用GRANT命o; q是一U双保险机制(此用戯必须具备GRANT权限才能执行GRANT命o)?/span>
shared-memory 允许使用内存(shared memory)q行通信(仅适用于Windows)?/span>
shared-memory-base-name = name l共享内存块起一个名?默认的名字是MySQL)?/span>
skip-grant-tables 不用mysql数据库里的信息来q行讉K控制(警告:q将允许用户M用户M改Q何数据库)?/span>
skip-host-cache 不用高速缓存区来存放主机名和IP地址的对应关pR?/span>
skip-name-resovle 不把IP地址解析Z机名; 与访问控?mysql.user数据?有关的检查全部通过IP地址行进?/span>
skip-networking 只允讔R过一个套接字文g(Unix/Linuxpȝ)或通过命名道(Windowspȝ)q行本地q接Q不允许ICP/IPq接; q提高了安全性,但阻断了来自|络的外部连接和所有的Java客户E序(Java客户即在本地连接里也用TCP/IP)?/span>
user = name mysqldE序在启动后在l定UNIX/Linux账户下执? mysqld必须从root账户启动才能在启动后切换到另一个̎户下执行; mysqld_safe脚本默认?#8211;user=mysql选项来启动mysqldE序?/span>

 

mysqldE序Q内存管理、优化、查询缓存区

bulk_insert_buffer_size = n Zơ插入多条新记录的INSERT命o分配的缓存区长度(默认讄?M)?/span>
key_buffer_size = n 用来存放索引区块的RMA?默认讄?M)?/span>
join_buffer_size = n 在参加JOIN操作的数据列没有索引时ؓJOIN操作分配的缓存区长度(默认讄?28K)?/span>
max_heap_table_size = n HEAP数据表的最大长?默认讄?6M); 过q个长度的HEAP数据表将被存入一个时文件而不是驻留在内存里?/span>
max_connections = n MySQL服务器同时处理的数据库连接的最大数?默认讄?00)?/span>
query_cache_limit = n 允许临时存放在查询缓存区里的查询l果的最大长?默认讄?M)?/span>
query_cache_size = n 查询~存区的最大长?默认讄?Q不开辟查询缓存区)?/span>
query_cache_type = 0/1/2 查询~存区的工作模式:0, 用查询~存? 1Q启用查询缓存区(默认讄); 2Q?#8221;按需分配”模式Q只响应SELECT SQL_CACHE命o?/span>
read_buffer_size = n Z数据表顺序读取数据的L作保留的~存区的长度(默认讄?28KB); q个选项的设|值在必要时可以用SQL命oSET SESSION read_buffer_size = n命o加以改变?/span>
read_rnd_buffer_size = n cM于read_buffer_size选项Q但针对的是按某U特定顺?比如使用了ORDER BY子句的查?输出的查询结?默认讄?56K)?/span>
sore_buffer = n 为排序操作分配的~存区的长度(默认讄?M); 如果q个~存区太,则必dZ个时文件来q行排序?/span>
table_cache = n 同时打开的数据表的数?默认讄?4)?/span>
tmp_table_size = n 临时HEAP数据表的最大长?默认讄?2M); 过q个长度的时数据表被转换为MyISAM数据表ƈ存入一个时文件?/span>

 

mysqldE序Q日?/strong>

log [= file] 把所有的q接以及所有的SQL命o记入日志(通用查询日志); 如果没有l出file参数QMySQL在数据库目录里创徏一个hostname.log文g作ؓq种日志文g(hostname是服务器的主机名)?/span>
log-slow-queries [= file] 把执行用时超qlong_query_time变量值的查询命o记入日志(慢查询日?; 如果没有l出file参数QMySQL在数据库目录里创徏一个hostname-slow.log文g作ؓq种日志文g(hostname是服务器L ??/span>
long_query_time = n 慢查询的执行用时上限(默认讄?0s)?/span>
long_queries_not_using_indexs 把慢查询以及执行时没有用烦引的查询命o全都记入日志(其余?#8211;log-slow-queries选项)?/span>
log-bin [= filename] 把对数据q行修改的所有SQL命o(也就是INSERT、UPDATE?DELETE命o)以二q制格式记入日志(二进制变更日志,binary update log)。这U日志的文g名是filename.n或默认的hostname.nQ其中n是一?位数字的整数(日志文g按顺序编??/span>
log-bin-index = filename 二进制日志功能的索引文g名。在默认情况下,q个索引文g与二q制日志文g的名字相同,但后~名是.index而不?nnnnnn?/span>
max_binlog_size = n 二进制日志文件的最大长?默认讄?GB)。在前一个二q制日志文g里的信息量超q这个最大长度之前,MySQL服务器会自动提供一个新的二q制日志文g接箋上?/span>
binlog-do-db = dbname 只把l定?据库里的变化情况记入二进制日志文Ӟ其他数据库里的变化情况不记蝲。如果需要记载多个数据库里的变化情况Q就必须在配|文件用多个本选项来设|,每个数据库一行?/span>
binlog-ignore-db = dbname 不把l定数据库里的变化情况记入二q制日志文g?/span>
sync_binlog = n 每经qnơ日志写操作把日志文g写入盘一?Ҏ志信息进行一ơ同?。n=1是最安全的做法,但效率最低。默认设|是n=0Q意思是由操作系l来负责二进制日志文件的同步工作?/span>
log-update [= file] 记蝲出错情况的日志文件名(出错日志)。这U日志功能无法禁用。如果没有给出file参数QMySQL会用hostname.err作ؓU日志文件的名字?/span>

 

mysqldE序Q镜?L镜像服务?

server-id = n l服务器分配一个独一无二的ID~号; n的取D围是1~2?2ơ方启用二进制日志功能?/span>
log-bin = name 启用二进制日志功能。这U日志的文g名是filename.n或默认的hostname.nQ其中的n是一?位数字的整数(日志文g序~号)?/span>
binlog-do/ignore-db = dbname 只把l定数据库里的变化情况记入二q制日志文g/不把l定的数据库里的变化记入二进制日志文件?/span>

 

mysqldE序Q镜?从属镜像服务?

server-id = n l服务器分配一个唯一的ID~号
log-slave-updates 启用从属服务器上的日志功能,使这台计机可以用来构成一个镜像链(A->B->C)?/span>
master-host = hostname L服务器的L名或IP地址。如果从属服务器上存在mater.info文g(镜像关系定义文g)Q它忽略此选项?/span>
master-user = replicusername 从属服务器用来连接主控服务器的用户名。如果从属服务器上存在mater.info文gQ它忽略此选项?/span>
master-password = passwd 从属服务器用来连接主控服务器的密码。如果从属服务器上存在mater.info文gQ它忽略此选项?/span>
master-port = n 从属服务器用来连接主控服务器的TCP/IP端口(默认讄?306端口)?/span>
master-connect-retry = n 如果与主控服务器的连接没有成功,则等待nU?s)后再q行理方式(默认讄?0s)。如果从属服务器存在mater.info文gQ它忽略此选项?/span>
master-ssl-xxx = xxx 对主、从服务器之间的SSL通信q行配置?/span>
read-only = 0/1 0: 允许从属服务器独立地执行SQL命o(默认讄); 1: 从属服务器只能执行来自主控服务器的SQL命o?/span>
read-log-purge = 0/1 1: 把处理完的SQL命o立刻从中l日志文仉删除(默认讄); 0: 不把处理完的SQL命o立刻从中l日志文仉删除?/span>
replicate-do-table = dbname.tablename ?#8211;replicate-do-table选项的含义和用法相同Q但数据库和数据库表名字里允许出现通配W?#8221;%” (例如: test%.%–对名字以”test”开头的所有数据库里的所以数据库表进行镜像处??/span>

 

replicate-do-db = name 只对q个数据库进行镜像处理?/span>
replicate-ignore-table = dbname.tablename 不对q个数据表进行镜像处理?/span>
replicate-wild-ignore-table = dbn.tablen 不对q些数据表进行镜像处理?/span>
replicate-ignore-db = dbname 不对q个数据库进行镜像处理?/span>
replicate-rewrite-db = db1name > db2name 把主控数据库上的db1name数据库镜像处理ؓ从属服务器上的db2name数据库?/span>
report-host = hostname 从属服务器的L? q项信息只与SHOW SLAVE HOSTS命o有关–L服务器可以用q条命o生成一份从属服务器的名单?/span>
slave-compressed-protocol = 1 丅R从服务器用压~格式进行通信–如果它们都支持这么做的话?/span>
slave-skip-errors = n1, n2, …或all 即发生出错代码为n1、n2{的错误Q镜像处理工作也l箋q行(即不发生什 么错误,镜像处理工作也l进?。如果配|得当,从属服务器不?该在执行 SQL命o时发生错?在主控服务器上执行出错的SQL命o不会被发送到从属服务器上做镜像处?; 如果不用slave-skip-errors选项Q从属服务器上的镜像工作可能因为发生错误而中断,中断后需要有人工参与才能l箋q行?/span>

 

mysqld–InnoDBQ基本设|、表I间文g

skip-innodb 不加载InnoDB数据表驱动程?#8211;如果用不着InnoDB数据表,可以用这个选项节省一些内存?/span>
innodb-file-per-table 为每一个新数据表创Z个表I间文g而不是把数据表都集中保存在中央表I间?后者是默认讄)。该选项始见于MySQL 4.1?/span>
innodb-open-file = n InnoDB数据表驱动程序最多可以同时打开的文件数(默认讄?00)。如果用了innodb-file-per-table选项q且需要同时打开很多数据表的话,q个数字很可能需要加大?/span>
innodb_data_home_dir = p InnoDBȝ录,所有与InnoDB数据表有关的目录或文件\径都相对于这个\径。在默认的情况下Q这个主目录是MySQL的数据目录?/span>
innodb_data_file_path = ts 用来容纳InnoDB为数据表的表I间: 可能涉及一个以上的文g; 每一个表I间文g的最大长度都必须以字?B)、兆字节(MB)或千兆字?GB)为单位给? 表空间文件的名字必须以分号隔开; 最后一个表I间文gq可以带一个autoextend属性和一个最大长?max:n)。例如,ibdata1:1G; ibdata2:1G:autoextend:max:2G的意思是: 表空间文件ibdata1的最大长度是1GBQibdata2的最大长度也?GQ但允许它扩充到2GB。除文g名外Q还可以用硬盘分区的讄名来定义? I间Q此时必ȝ表空间的最大初始长度值加上newraw关键字做后缀Q给表空间的最大扩充长度值加上raw关键字做后缀(例如/dev/hdb1: 20Gnewraw?dev/hdb1:20Graw); MySQL 4.0及更高版本的默认讄是ibdata1:10M:autoextend?/span>
innodb_autoextend_increment = n 带有autoextend属性的表空间文件每ơ加大多兆字节(默认讄?MB)。这个属性不涉及具体的数据表文gQ那些文件的增大速度相对是比较小的?/span>
innodb_lock_wait_timeout = n 如果某个事务在等待nU?s)后还没有获得所需要的资源Q就使用ROLLBACK命o攑ּq个事务。这设|对于发现和处理未能被InnoDB数据表驱?E序识别出来的死锁条件有着重要的意义。这个选项的默认设|是50s?/span>
innodb_fast_shutdown 0/1 是否以最快的速度关闭InnoDBQ默认设|是1Q意思是不把~存?INSERT~存区的数据写入数据表,那些数据在MySQL服务器下ơ启?时再写入 (q么做没有什么风险,因ؓINSERT~存区是表空间的一个组成部分,数据不会丢失)。把q个选项讄?反面危险Q因为在计算机关闭时QInnoDB 驱动E序很可能没有够的旉完成它的数据同步工作Q操作系l也怼在它完成数据同步工作之前l束InnoDBQ而这会导致数据不完整?/span>

 

mysqldE序QInnoDB–日志

innodb_log_group_home_dir = p 用来存放InnoDB日志文g的目录\?如ib_logfile0、ib_logfile1{?。在默认的情况下QInnoDB驱动E序?MySQL数据目录作ؓ自己保存日志文g的位|?/span>
innodb_log_files_in_group = n 使用多少个日志文?默认讄?)。InnoDB数据表驱动程序将以轮转方式依ơ填写这些文? 当所有的日志文g都写满以后,之后的日志信息将写入W一个日志文件的最大长?默认讄?MB)。这个长度必MMB(兆字?或GB(千兆字节)为单 位进行设|?/span>
innodb_flush_log_at_trx_commit = 0/1/2 q个选项军_着什么时候把日志信息写入日志文g以及什么时候把q些文g物理地写 (术语UCؓ”同步”)到硬盘上。设|?的意思是每隔一U写一ơ日 志ƈq行 同步Q这可以减少盘写操作次敎ͼ但可能造成数据丢失; 讄?(讄讄)的意思是在每执行完一条COMMIT命o写一ơ日志ƈq行同步Q这可以防止数据丢失Q但盘写操作可能会很频J? 讄?是一般折L办法Q即每执行完一条COMMIT命o写一ơ日志,每隔一U进行一ơ同步?/span>
innodb_flush_method = x InnoDB日志文g的同步办?仅适用于UNIX/Linuxpȝ)。这个选项的可取值有两种: fdatasyncQ用fsync()函数q行同步; O_DSYNCQ用O_SYNC()函数q行同步?/span>
innodb_log_archive = 1 启用InnoDB驱动E序的archive(档案)日志功能Q把日志信息写入ib_arch_log_n文g。启用这U日志功能在InnoDB?MySQL一起用时没有多大意义(启用MySQL服务器的二进制日志功能就_用了)?/span>

 

mysqldE序–InnoDBQ缓存区的设|和优化

innodb_log_buffer_pool_size = n 为InnoDB数据表及其烦引而保留的RAM内存?默认讄?MB)。这个参数对速度有着相当大的影响Q如果计机上只q行?MySQL/InnoDB数据库服务器Q就应该把全部内存的80%用于q个用途?/span>

 

innodb_log_buffer_size = n 事务日志文g写操作缓存区的最大长?默认讄?MB)?/span>
innodb_additional_men_pool_size = n 为用于内部管理的各种数据l构分配的缓存区最大长?默认讄?MB)?/span>
innodb_file_io_threads = n I/O操作(盘写操?的最大线E个?默认讄?)?/span>
innodb_thread_concurrency = n InnoDB驱动E序能够同时使用的最大线E个?默认讄?)?/span>

 

mysqldE序Q其它选项

bind-address = ipaddr MySQL服务器的IP地址。如果MySQL服务器所在的计算机有多个IP地址Q这个选项非帔R要?/span>
default-storage-engine = type 新数据表的默认数据表cd(默认讄是MyISAM)。这设|还可以通过–default-table-type选项来设|?/span>
default-timezone = name 为MySQL服务器设|一个地理时?如果它与本地计算机的地理时区不一??/span>
ft_min_word_len = n 全文索引的最单词长度工。这个选项的默认设|是4Q意思是在创建全文烦引时不考虑那些?个或更少的字W构建单词?/span>
Max-allowed-packet = n 客户与服务器之间交换的数据包的最大长度,q个数字臛_应该大于客户E序要处理的最大BLOB块的长度。这个选项的默认设|是1MB?/span>
Sql-mode = model1, mode2, … MySQL运行在哪一USQL模式下。这个选项的作用是让MySQL与其他的数据库系l保持最大程度的兼容。这个选项的可取值包括ansi、db2?oracle、no_zero_date、pipes_as_concat?/span>

 

注意Q如果在配置文g里给出的某个选项是mysqld无法识别的,MySQL服务器将不启动?/span>



]]>
mongdb介绍 (?http://www.shnenglu.com/guojingjia2006/archive/2012/12/24/196573.html果?/dc:creator>果?/author>Mon, 24 Dec 2012 09:19:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2012/12/24/196573.htmlhttp://www.shnenglu.com/guojingjia2006/comments/196573.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2012/12/24/196573.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/196573.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/196573.html阅读全文

]]>
mongodb常用命ohttp://www.shnenglu.com/guojingjia2006/archive/2012/12/24/196572.html果?/dc:creator>果?/author>Mon, 24 Dec 2012 09:02:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2012/12/24/196572.htmlhttp://www.shnenglu.com/guojingjia2006/comments/196572.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2012/12/24/196572.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/196572.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/196572.html

shell操作数据库:

 

  1. 用户相关Q?/p>

         1. #q入数据?span>admin

use admin

         2. #增加或修改用户密?/p>

          db.addUser('name','pwd')

         3. #查看用户列表

          db.system.users.find()

         4. #用户认证

          db.auth('name','pwd')

         5. #删除用户

          db.removeUser('name')

         6. #查看所有用?/p>

          show users

         7. #查看所有数据库

          show dbs

         8. #查看所有的collection

          show collections

         9. #查看?span>collection的状?/span>

          db.printCollectionStats()

        10. #查看M复制状?/p>

          db.printReplicationInfo()

        11. #修复数据?/p>

          db.repairDatabase()

        12. #讄记录profilingQ?=off 1=slow 2=all

          db.setProfilingLevel(1)

        13. #查看profiling

          show profile

        14. #拯数据?/p>

          db.copyDatabase('mail_addr','mail_addr_tmp')

        15. #删除collection

          db.mail_addr.drop()

        16. #删除当前的数据库

          db.dropDatabase()

       

   2. 增删?/p>

         1. #存储嵌套的对?/p>

db.foo.save({'name':'ysz','address':{'city':'beijing','post':100096},'phone':[138,139]})

 

         2. #存储数组对象

db.user_addr.save({'Uid':'yushunzhi@sohu.com','Al':['test-1@sohu.com','test-2@sohu.com']})

 

         3. #Ҏquery条g修改Q如果不存在则插入,允许修改多条记录

            db.foo.update({'yy':5},{'$set':{'xx':2}},upsert=true,multi=true)

         4. #删除yy=5的记?/span>

            db.foo.remove({'yy':5})

         5. #删除所有的记录

            db.foo.remove()

 

   3. 索引

         1. #增加索引Q?span>1(ascending),-1(descending)

         2. db.foo.ensureIndex({firstname: 1, lastname: 1}, {unique: true});

         3. #索引子对?/p>

         4. db.user_addr.ensureIndex({'Al.Em': 1})

         5. #查看索引信息

         6. db.foo.getIndexes()

         7. db.foo.getIndexKeys()

         8. #Ҏ索引名删除烦?/p>

         9. db.user_addr.dropIndex('Al.Em_1')

 

  4. 查询

         1. #查找所?/p>

        2. db.foo.find()

        3. #查找一条记?/p>

        4. db.foo.findOne()

        5. #Ҏ条g?span>10条记?/span>

        6. db.foo.find({'msg':'Hello 1'}).limit(10)

        7. #sort排序

        8. db.deliver_status.find({'From':'ixigua@sina.com'}).sort({'Dt',-1})

         9. db.deliver_status.find().sort({'Ct':-1}).limit(1)

        10. #count操作

        11. db.user_addr.count()

        12. #distinct操作,查询指定列,去重?/span>

        13. db.foo.distinct('msg')

        14. #”>=”操作

        15. db.foo.find({"timestamp": {"$gte" : 2}})

        16. #子对象的查找

        17. db.foo.find({'address.city':'beijing'})

   5. 理

         1. #查看collection数据的大?/span>

         2. db.deliver_status.dataSize()

         3. #查看colleciont状?/span>

         4. db.deliver_status.stats()

         5. #查询所有烦引的大小

         6. db.deliver_status.totalIndexSize()

 

5. advanced queries:高查询


条g操作W?span> 
$gt : > 
$lt : < 
$gte: >= 
$lte: <= 
$ne : !=?span><> 
$in : in 
$nin: not in 
$all: all 
$not: 反匹?1.3.3及以上版? 

查询 name <> "bruce" and age >= 18 的数?span> 
db.users.find({name: {$ne: "bruce"}, age: {$gte: 18}}); 

查询 creation_date > '2010-01-01' and creation_date <= '2010-12-31' 的数?span> 
db.users.find({creation_date:{$gt:new Date(2010,0,1), $lte:new Date(2010,11,31)}); 

查询 age in (20,22,24,26) 的数?span> 
db.users.find({age: {$in: [20,22,24,26]}}); 

查询 age取模10{于0 的数?span> 
db.users.find('this.age % 10 == 0'); 
或?span> 
db.users.find({age : {$mod : [10, 0]}}); 

匚w所?span> 
db.users.find({favorite_number : {$all : [6, 8]}}); 
可以查询?span>{name: 'David', age: 26, favorite_number: [ 6, 8, 9 ] } 
可以不查询出{name: 'David', age: 26, favorite_number: [ 6, 7, 9 ] } 

查询不匹配name=B*带头的记?span> 
db.users.find({name: {$not: /^B.*/}}); 
查询 age取模10不等?span>0 的数?span> 
db.users.find({age : {$not: {$mod : [10, 0]}}}); 

#q回部分字段 
选择q回age和_id字段(_id字段L会被q回
db.users.find({}, {age:1}); 
db.users.find({}, {age:3}); 
db.users.find({}, {age:true}); 
db.users.find({ name : "bruce" }, {age:1}); 
0
?span>false, ?为true 

选择q回age、address和_id字段 
db.users.find({ name : "bruce" }, {age:1, address:1}); 

排除q回age、address和_id字段 
db.users.find({}, {age:0, address:false}); 
db.users.find({ name : "bruce" }, {age:0, address:false}); 

数组元素个数判断 
对于{name: 'David', age: 26, favorite_number: [ 6, 7, 9 ] }记录 
匚wdb.users.find({favorite_number: {$size: 3}}); 
不匹?span>db.users.find({favorite_number: {$size: 2}}); 

$exists判断字段是否存在 
查询所有存在name字段的记?span> 
db.users.find({name: {$exists: true}}); 
查询所有不存在phone字段的记?span> 
db.users.find({phone: {$exists: false}}); 

$type判断字段cd 
查询所有name字段是字W类型的 
db.users.find({name: {$type: 2}}); 
查询所有age字段是整型的 
db.users.find({age: {$type: 16}}); 

对于字符字段Q可以用正则表辑ּ 
查询以字母b或者B带头的所有记?span> 
db.users.find({name: /^b.*/i}); 

$elemMatch(1.3.1及以上版? 
为数l的字段中匹配其中某个元?nbsp;

Javascript查询?where查询 
查询 age > 18 的记录,以下查询都一?span> 
db.users.find({age: {$gt: 18}}); 
db.users.find({$where: "this.age > 18"}); 
db.users.find("this.age > 18"); 
f = function() {return this.age > 18} db.users.find(f); 

排序sort() 
以年龄升?span>asc 
db.users.find().sort({age: 1}); 
以年龄降?span>desc 
db.users.find().sort({age: -1}); 

限制q回记录数量limit() 
q回5条记?nbsp;
db.users.find().limit(5); 
q回3条记录ƈ打印信息 
db.users.find().limit(3).forEach(function(user) {print('my age is ' + user.age)}); 
l果 
my age is 18 
my age is 19 
my age is 20 

限制q回记录的开始点skip() 
从第3条记录开始,q回5条记?span>(limit 3, 5) 
db.users.find().skip(3).limit(5); 

查询记录条数count() 
db.users.find().count(); 
db.users.find({age:18}).count(); 
以下q回的不?Q而是user表中所有的记录数量 
db.users.find().skip(10).limit(5).count(); 
如果要返回限制之后的记录数量Q要使用count(true)或者count(?) 
db.users.find().skip(10).limit(5).count(true); 

分组group() 
假设test表只有以下一条数?span> 
{ domain: "www.mongodb.org" 
, invoked_at: {d:"2009-11-03", t:"17:14:05"} 
, response_time: 0.05 
, http_action: "GET /display/DOCS/Aggregation" 

使用groupl计test?1月䆾的数据count:count(*)、total_time:sum(response_time)?span>avg_time:total_time/count; 
db.test.group( 
{ cond: {"invoked_at.d": {$gt: "2009-11", $lt: "2009-12"}} 
, key: {http_action: true} 
, initial: {count: 0, total_time:0} 
, reduce: function(doc, out){ out.count++; out.total_time+=doc.response_time } 
, finalize: function(out){ out.avg_time = out.total_time / out.count } 
} ); 



"http_action" : "GET /display/DOCS/Aggregation", 
"count" : 1, 
"total_time" : 0.05, 
"avg_time" : 0.05 
}
]


windows 服务启动:
E:\APMServ5.2.6\MongoDb\bin>mongod --logpath E:\APMServ5.2.6\MongoDb\logs\MongoDB.log --logappend --dbpath E:\APMServ5.2.6\MongoDb\data --directoryperdb --serviceName MongoDB --install


]]>
MongoDb Architecturehttp://www.shnenglu.com/guojingjia2006/archive/2012/12/19/196438.html果?/dc:creator>果?/author>Wed, 19 Dec 2012 03:52:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2012/12/19/196438.htmlhttp://www.shnenglu.com/guojingjia2006/comments/196438.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2012/12/19/196438.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/196438.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/196438.html本文囄来自 Ricky Ho 的博?MongoDB 构架Q?a title="查看 MongoDB 的全部文? target="_blank">MongoDB ArchitectureQ,q是个一听就感觉很宽泛的话题Q但是作者在文章中确实对 MongoDB 由内臛_?a title="查看架构的全部文? target="_blank">架构q行了剖析。本文截取了其文章中的几张重Ҏ构示意图片进行简单描q。希望对大家有用?/div>
MongoDB 数据文g内部l构

  1. MongoDB 在数据存储上按命名空间来划分Q一?collection 是一个命名空_一个烦引也是一个命名空?/li>
  2. 同一个命名空间的数据被分成很多个 ExtentQExtent 之间使用双向链表q接
  3. 在每一?Extent 中,保存了具体每一行的数据Q这些数据也是通过双向链接q接?/li>
  4. 每一行数据存储空间不仅包括数据占用空_q可能包含一部分附加I间Q这使得在数?update 变大后可以不Ud位置
  5. 索引?BTree l构实现
  ?MongoDB 中实C?/strong>

众所周知QMongoDB 只支持对单行记录的原子性修改,q不支持对多行数据的原子操作。但是通过上图中的变态操作,实际你也可以自己实现事务。其步骤如图所未:
  • W?1 步:先记录一条事务记录,要修改的多行记录的修改值写到里面,q设|其状态ؓ initQ如果这时候操作中断,那么在重新启动时Q会判断C处于 init 状态,从而将其保存的多行修改操作应用到具体的行上Q?/li>
  • W?2 步:然后更新具体要修改的行,刚才写的事务记录的标识写到它的 tran 字段?/li>
  • W?3 步:事务记录的状态从 init 变成 pendingQ如果在q时候操作中断,那么在重新启动时Q会判断到它的状态是 pending 的,q时候查看其所有对应的多条要修改的记录Q如果其 tran 有|那么p行第 4 步,如果没|说明W?4 步已l执行过了,直接其状态从 pending 变成 commited 了就行)
  • W?4 步:需要修改的多条记录的相应g改了Qƈ?unset 掉之前的 tran 字段
  • W?5 步:事务记录那一条的状态从 pending 变成 commitedQ事务完?/li>

        其实上面的步骤ƈ不罕见,在支持事务的 DBMS 中,其事务原子性提交的保证大多都与上面cM。其实事务记录的 tran 那条记录Q就cM于这?DBMS 中的 redolog 一栗?/p>

  MongoDB 数据同步

上图?MongoDB 采用 Replica Sets 模式的同步流E?
  • U色头表示写操作写?Primary 上,然后异步同步到多?Secondary ?/li>
  • 蓝色头表示L作可以从 Primary ?Secondary L一个上?/li>
  • 各个 Primary ?Secondary 之间一直保持心跛_步检,用于判断 Replica Sets 的状?/li>

        分片机制


  • MongoDB 的分片是指定一个分?key 来进行,数据按范围分成不同的 chunkQ每?chunk 的大有限制
  • 有多个分片节点保存这?chunkQ每个节点保存一部分?chunk
  • 每一个分片节炚w是一?Replica SetsQ这样保证数据的安全?/strong>
  • 当一?chunk 过光制的最大体U时Q会分裂成两个小?chunk
  • ?chunk 在分片节点中分布不均衡时Q会引发 chunk q移操作

        服务器角?/strong>

 

 上面讲了分片的标准,下面是具体在分片时的几种节点角色
  • 客户端访问\p?mongos 来进行数据读?/li>
  • config 服务器保存了两个映射关系Q一个是 key 值的区间对应哪一?chunk 的映关p,另一个是 chunk 存在哪一个分片节点的映射关系
  • 路由节点通过 config 服务器获取数据信息,通过q些信息Q找到真正存放数据的分片节点q行对应操作
  • 路由节点q会在写操作时判断当?chunk 是否出限定大小Q如果超出,分列成两个 chunk
  • 对于按分?key q行的查询和 update 操作来说Q\p点会查到具体?chunk 然后再进行相关的工作
  • 对于不按分片 key q行的查询和 update 操作来说Qmongos 会对所有下属节点发送请求然后再对返回结果进行合q?/li>

        更多详细内容L原文Q?a target="_blank">MongoDB Architecture

 



]]>
MongoDB 学习 (1)http://www.shnenglu.com/guojingjia2006/archive/2012/12/19/196437.html果?/dc:creator>果?/author>Wed, 19 Dec 2012 03:34:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2012/12/19/196437.htmlhttp://www.shnenglu.com/guojingjia2006/comments/196437.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2012/12/19/196437.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/196437.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/196437.html

Mongo是一个高性能Q开源,无模式的文档型数据库Q它在许多场景下可用于替代传l的关系型数据库或键/值存储方式。Mongo使用C++开发,提供了以下功能:

◆面向集合的存储:适合存储对象及JSON形式的数据?/p>

◆动态查询:Mongo支持丰富的查询表辑ּ。查询指令用JSON形式的标讎ͼ可轻易查询文档中内嵌的对象及数组?/p>

◆完整的烦引支持:包括文档内嵌对象及数l。Mongo的查询优化器会分析查询表辑ּQƈ生成一个高效的查询计划?/p>

◆查询监视QMongo包含一个监视工L于分析数据库操作的性能?/p>

◆复制及自动故障{U:Mongo数据库支持服务器之间的数据复Ӟ支持?从模式及服务器之间的怺复制。复制的主要目标是提供冗余及自动故障转移?/p>

◆高效的传l存储方式:支持二进制数据及大型对象Q如照片或图片)?/p>

◆自动分片以支持云U别的׾~性(处于早期alpha阶段Q:自动分片功能支持水^的数据库集群Q可动态添加额外的机器?/p>

MongoDB的主要目标是在键/值存储方式(提供了高性能和高度׾~性)以及传统的RDBMSpȝQ丰富的功能Q架起一座桥梁,集两者的优势于一w。根据官方网站的描述QMongo适合用于以下场景Q?/p>

◆|站数据QMongo非常适合实时的插入,更新与查询,q具备网站实时数据存储所需的复制及高度伸羃性?/p>

◆~存Q由于性能很高QMongo也适合作ؓ信息基础设施的缓存层。在pȝ重启之后Q由Mongo搭徏的持久化~存层可以避免下层的数据源过载?/p>

◆大尺寸,低h值的数据Q用传l的关系型数据库存储一些数据时可能会比较昂贵,在此之前Q很多时候程序员往往会选择传统的文件进行存储?/p>

◆高׾~性的场景QMongo非常适合由数十或数百台服务器l成的数据库。Mongo的\U图中已l包含对MapReduce引擎的内|支持?/p>

◆用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询?/p>

自然QMongoDB的用也会有一些限Ӟ例如它不适合Q?/p>

◆高度事务性的pȝQ例如银行或会计pȝ。传l的关系型数据库目前q是更适用于需要大量原子性复杂事务的应用E序?/p>

◆传统的商业智能应用:针对特定问题的BI数据库会对生高度优化的查询方式。对于此cd用,数据仓库可能是更合适的选择?/p>

◆需要SQL的问?/p>

MongoDB支持OS X、Linux及Windows{操作系l,q提供了PythonQPHPQRubyQJava及C++语言的驱动程序,C֌中也提供了对Erlang?NET{^台的驱动E序?/p>

]]>
mysql 只允许本地登?tcp/ip or sock)http://www.shnenglu.com/guojingjia2006/archive/2012/12/17/196383.html果?/dc:creator>果?/author>Mon, 17 Dec 2012 10:14:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2012/12/17/196383.htmlhttp://www.shnenglu.com/guojingjia2006/comments/196383.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2012/12/17/196383.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/196383.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/196383.html
1.my.cnf
#skip-networking
bind-address = 127.0.0.1

此项讄允许 tcp/ip 讉KQ但是只?27.0.0.1 有可以访?如果把skip-networking 开启。则只能通过sockq接?br />Z提下Q?div>

mysql -h localhost -u eric -p saker

mysql -h 127.0.0.1 -u eric -p saker

 

q两个命令在skip-networking 开启的时候localhost能正常登录mysql,但是127.0.0.1不能。具体原因如下:


大多数程序将L名localhost和IP地址127.0.0.1 视作“本地服务?#8221;的同义词?/p>

 

但在UNIXpȝ中,MySQL 有所不同Q?br /> 出现localhostӞMySQL会尝试用一个Unix domain socket 文g来连接本地服务器?/p>

要强制用TCP/IPq接到本地服务器Q那׃用IP地址 127.0.0.1 而不是主机名localhost?br /> 可以通过指定 --protocol=tcp 选项来强制用TCP/IPq行q接

TCP/IP q接的默认端口号?3306.
2.mysql 讄好了Q只允许本地d。但是允讔R过sshq程d
原理Q无论是windowsq是 linux,W一步就是本Cmysql服务器徏立一个ssl tunnelQ?br />
利用ssh命o在本机开?3xx的端口,q个端口为隧道的入口端口,出口是数据库的3306Q如果默认端口没被修改的?,
linux如下Q?
ssh -NCPf root@localaddress -L 3388:mysqlserver:3306

参数解释

-C    使用压羃功能Q是可选的Q加快速度?nbsp;
-P    用一个非Ҏ端口q行出去的连接?nbsp;
-f    一旦SSH完成认证q徏立port forwardingQ则转入后台q行?nbsp;
-N    不执行远E命令。该参数在只打开转发端口时很有用QV2版本SSH支持Q?/p>


1)如果是windows 下用navicat for mysql 之类的数据库理软gQ比较简单,
?常规"选项卡填写主机名为localhost?27.0.0.1,q程数据库的账号和密?br />"SSH"选项卡填写远E服务器的主机名和ssh端口P及登录的用户和密?试q接是否成功
2)windows 暂时没找出类?div>ssh -NCPf root@localaddress -L 3388:mysqlserver:3306命o安静模式下徏立ssh tunnel?我用了putty试了下。连接可以成功。呆后箋研究

3.mysql M备䆾使用ssh tunnel,下面摘自别h文章Q待验证
1). 备䆾初始数据?
关闭所有相关的数据更新操作E序Q或者对要备份的数据库加锁,避免更新Q然后用 tar 备䆾C服务器上。或者可以用mysqlhotcopy?
2). 需要在L务器上,配置日志功能
q需要重启服务,使其启用日志功能。配|文?my.cnf 可以攑֜ mysql 的安装目录中?br />
[mysqld] 
server-id=1
log-bin=mydb-bin
binlog-do-db=mydb
重启服务后,可以在数据目录下Q看见该数据库的日志文gQƈ且可以通过 "show master status"Q查看到L务器的状态?
3). 讄备用用户
mysql>GRANT REPLICATION SLAVE ON *.* TO backup@'localhost' IDENTIFIED BY 'backup';
q里之所以用本地q接Q是因ؓ后面采用 ssh 隧道q接 mysql
4). 讄从服务器
[mysqld]
server-id=2
master-host=127.0.0.1
master-port=3307
master-user=backup
master-password=backup
master-connect-retry=10
report-host=127.0.0.1
5). q程q接隧道
ssh -f -N -4 -L 3307:127.0.0.1:3306 mysqlm@remotemysql  
6). 启动从服务器
可以通过 "show processlist"Q查看备份情cƈ且可以查看mysql的错误日志,了解是否q接正常Q同步备份功能是否工作正常?
4.因ؓ使用yii框架在写一个项目,所以远Emysql止直接d后,yii的配|文件也要相应修改,linux下比较简单,可参看以?br />
http://www.yiiframework.com/forum/index.php/topic/30678-mysql-through-ssh-tunnel/
windows待箋......


]]>
Amoeba for MySQL---分布式数据库Proxy解决Ҏhttp://www.shnenglu.com/guojingjia2006/archive/2012/12/13/196220.html果?/dc:creator>果?/author>Thu, 13 Dec 2012 09:14:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2012/12/13/196220.htmlhttp://www.shnenglu.com/guojingjia2006/comments/196220.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2012/12/13/196220.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/196220.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/196220.html

Amoeba for MySQL 位于Client、Database Server(s)之间Q具有负载均衡、高可用性、sqlqo、可承受高ƈ发、读写分RQuery RouteQ解析sql query语句Qƈ且根据条件与预先讑֮的规则,h到指定的目标数据库。可q发h多台数据库合q结果)、对客户端透明Q能降低数据切分带来的复杂多数据库结构、数据切分规则给应用带来的媄响。适用mysql 4.1或者以上版本(mysql 协议版本Q?0Q暂时不支持事务、DDL语句目前只会分配l默认的数据库执行,q行环境臛_需要运?mysql 4.1以上服务, Java 1.5或以上版本?br /> Amoeba与mysql proxy存在一些区别。在mysql proxy上面如果惌d分离q且读集、写集群机器比较多情况下Q用mysql proxy 需要自己写一个LUA脚本Q目前mysql proxy没有现成的比较好的lua脚本。amoeba只需要进行相关的配置可以满需求?/p>


一、Mysql Master/Slave l构之下的读写分:
MasterQ?serverM Q主库,接收写操作)
slavesQserverA、serverB、serverCQ?个辅库,只读操作Q?/p>

amoeba提供d分离pool相关配置Q可配置serverA、serverB、serverC形成一个虚拟的virtualSlave,该配|提供LB,failover/failbackup功能.
 
<dbServer name="virtualSlave" virtual="true"> 
    <poolConfig> 
        <className>com.meidusa.amoeba.server.MultipleServerPool</className> 
        <!-- 负蝲均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED --> 
        <property name="loadbalance">1</property> 
                  
        <!-- 参与该pool负蝲均衡的poolName列表以逗号分割 --> 
        <property name="poolNames">serverA,serverB,serverC</property> 
    </poolConfig> 
</dbServer> 


<dbServer name="virtualSlave" virtual="true">
 <poolConfig>
  <className>com.meidusa.amoeba.server.MultipleServerPool</className>
  <!-- 负蝲均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED -->
  <property name="loadbalance">1</property>
    
  <!-- 参与该pool负蝲均衡的poolName列表以逗号分割 -->
  <property name="poolNames">serverA,serverB,serverC</property>
 </poolConfig>
</dbServer>

 

如果不启用数据切分功能,那么只需要配|QueryRouter属?br /> wirtePool=serverM
readPool=virtualSlave

<queryRouter> 
    <className>com.meidusa.amoeba.mysql.parser.MysqlQueryRouter</className> 
    <property name="LRUMapSize">1500</property> 
    <property name="defaultPool">serverM</property> 
 
    <property name="writePool">serverM</property> 
    <property name="readPool">virtualSlave</property> 
 
    <property name="needParse">true</property> 
</queryRouter> 

 <queryRouter>
  <className>com.meidusa.amoeba.mysql.parser.MysqlQueryRouter</className>
  <property name="LRUMapSize">1500</property>
  <property name="defaultPool">serverM</property>

  <property name="writePool">serverM</property>
  <property name="readPool">virtualSlave</property>

  <property name="needParse">true</property>
 </queryRouter>


client发送过来的update/insert/delete语句被发送到wirtePoolQ将select语句发送到readPool机器执行?/p>

 

二、数据切分方面:
q方面amoeba昄也很ҎQD个数据切分例子:

select * from user_event where user_id='test' and  gmt_create between Sysdate() -1 and Sysdate()

如果Ҏgmt_create 旉q行数据切分Q比?个月q行切分一ơ,amoeba提供利用cMsql表达式进行数据切分:

规则1QGMT_CREATE > to_date('2008-01-01','yyyy-mm-dd') and GMT_CREATE < to_date('2008-05-31','yyyy-mm-dd')

规则1对应服务?

规则2QGMT_CREATE > to_date('2008-06-01','yyyy-mm-dd') and GMT_CREATE < to_date('2008-12-31','yyyy-mm-dd')

规则2对应服务?
上面的sql的条?gmt_create 与规则里面的的gmt_create q行交集判断Q如果存在交集则表示W合规则Q则会将sql转移?规则1 的相应的服务器上面执行?/p>

利用amoeba写出q种cM规则很容易,但是要想做到数据切分以后可线性扩容,那么q样的规则需要自己根据业务实际情况进行设|。amoeba可同时将 sqlq发分发到多台服务器、然后将l果合ƈ再反馈给客户端,而且amoeba内部采用无阻塞模式,工作U程是不会等待的,q发h多台 database server情况下,客户端等待的旉基本上面是性能最差的那台database serverQamoeba内部解析协议旉?/p>


中文文档地址Q?http://amoeba.sourceforge.net/amoeba.pdf
amoeba 未来发展方向Q?http://amoeba.sourceforge.net/amoeba-big-picture.pdf

文g下蝲Q?http://www.sourceforge.net/projects/amoeba
amoeba 开发者博? http://amoeba.meidusa.com

转自:
http://blog.sina.com.cn/s/blog_499740cb0100g45w.html


]]>
mysqldump备䆾数据?MySQLhttp://www.shnenglu.com/guojingjia2006/archive/2012/08/10/186826.html果?/dc:creator>果?/author>Fri, 10 Aug 2012 06:35:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2012/08/10/186826.htmlhttp://www.shnenglu.com/guojingjia2006/comments/186826.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2012/08/10/186826.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/186826.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/186826.html

mysql数据库备份一般用命?/span>mysqldumpQ这个命令会在屏q打印指定数据库、数据表的创建的SQL语句和数据表中数据的插入SQL语句。该命o导出?/span>SQL语句在不同数据库之间是可UL的?/span>

mysqldumpq可以同时导出包?/span>sql语句的文件和以特定符号分割的数据文g

 

下面介绍mysqldump的用法:

 

mysqldump的用法有三种Q?/span>

mysqldump [options] database_name [table1 table2 ...]

备䆾特定数据库,可以指定特定表,以空格分?/p>

mysqldump [options] --database database1 database2

备䆾特定数据?/p>

mysqldump [options] --all-database / mysqldump [options] -A

备䆾所有数据库

 

mysqldumpq有很多选项Q下面根据选项的用频率依ơ介l?/span>

--user=user_name / -u user_name

q接数据库的用户Q?/span>-u后面的空格可有可?/span>

--password[=password] / -p[password]

注意-p后面跟密码时Q中间不能间隔空格号Q表C接数据库用户对应的密?/span>

--host=host_name / -h host_name

注意-h后面一定要有空|数据库所在服务器?/span>ip地址或者域?/span>

--port=port_num / -P port_num

服务器上数据库通讯使用的端口号Q?/span>-P后的I格可有可无

--result-file=file / -r file

指定输出的信息到文gQ而终端不输出文字

使用该选项要好于终端的输出重定向,因ؓ重定向可能会发生字符~码的问?/p>

=====================================================================================

--tab=path / -T path

产生tab分割的数据文件。对于每个{储的表,mysqldump创徏一个包含创?/span>CREATE TABLE语句?/span>tbl_name.sql文gQ和一个包含其数据?/span>tbl_name.txt文g。选项值定义写入文件的目录?/span>默认情况Q?/span>.txt数据文g的格式是在列值和每行后面的新行之间?/span>tab字符。可以?/span>--fields-xxx?/span>--?/span>--xxx选项明显指定格式?/span>

需要注意的是:该选项其实是间接调用了两个命oQ第一个命令类?/span>SHOW CREATE TABLEQ第二个产生数据文g的命令等同于SELECT … INTO OUTFILE '文g路径'Q所以和SELECT … INTO OUTFILE的特点相同,产生的数据文件只能存到服务器中,而不能存到客hQ所以对指定的目录\?/span>path是针Ҏ务器操作pȝ的,q且对目录\?/span>path要有d的用h限。如果想把类似的数据格式化导出文件存到客hQ可以参?/span>$ >mysql -e "SELECT …  FROM … WHERE … " > file_path

--fields-terminated-by=

该选项q同-T选项一起用,规定了数据域以什么结束,参数为字W串Q默认ؓ\t

--fields-enclosed-by=

该选项q同-T选项一起用,规定了数据域用什么符hhQ默认ؓI,一般可以是双引受括L

--fields-optionally-enclosed-by=

该选项q同-T选项一起用,规定了数据域可以用什么符hhQ因Zؓ只有部分数据用这些符hh

--fields-escaped-by=

该选项q同-T选项一起用,规定了{义字W,参数为字W,默认?/span>\

--lines-terminated-by=

该选项q同-T选项一起用,规定了数据行以什么结束,参数为字W串Q?/span>windows默认?/span>\r\n

=====================================================================================

--add-drop-database

在每?/span>CREATE DATABASE语句前添?/span>DROP DATABASE语句

--compatible=name

产生与其它数据库pȝ或旧?/span>MySQL服务器更兼容的输出。值可以ؓansiQ标?/span>SQLQ?/span>mysql323?/span>mysql40?/span>postgresql?/span>oracle?/span>mssql?/span>db2?/span>maxdb?/span>no_key_options?/span>no_table_options或?/span>no_field_options。同时用几个选项Q要用逗号它们隔开

No_key_options不输?/span>mysql专用索引选项

No_table_options不输?/span>mysql专用表选项Q如ENGINE=MyISAM

No_field_options不输?/span>mysql专用列选项

--compact

产生量输出Q?/span>该选项相当?/span>--comments=0?/span>--skip-add-drop-table?/span>--no-set-name?/span>--skip-disable-key?/span>--skip-add-locking一起?/span>

--comments[={0|1}]

如果讄?/span> 0Q禁止{储文件中的其它信息,例如E序版本、服务器版本和主机?/span>--skip-comments?/span>--comments=0的结果相同, 默认gؓ1Q即包括额外信息

--compress / -C

如果客户端和服务器都支持压羃Q则压羃双方传送的所有信?/p>

--default-character-set=charset

使用charsetas默认字符集,如果没有指定Q?/span>mysqldump使用utf8

--delayed-insert

使用INSERT DELAYED语句插入?/span>

--default-character-set=charset

使用charset作ؓ默认字符?/span>

--allow-keywords

允许创徏关键字列?/span>Q?/span>应在每个列名前面加上表名前缀

====================================================================================

--opt

该选项应该同时代表优化(optimize)和选项(option)意思,默认开?/span>Q相当于同时开启以下多个选项Q省得用hơ都键入选项Q?/span>--add-drop-table --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset。它可以l出很快的{储操作ƈ产生一个可以很快装?/span>MySQL服务器的转储文g?/span>可以?/span>--skip-opt。要惛_用信?/span>-opt启用的选项Q?/span>--skip形式Q例如,--skip-add-drop-tables?/span>--skip-quick

该选项比较重要Q但是由于默认开启,所以不常用

--add-drop-table

在每?/span>CREATE TABLE语句前添?/span>DROP TABLE语句

--add-locking

?/span>LOCK TABLES?/span>UNLOCK TABLES语句引用每个表{储,重蝲转储文g时插入得更快

--create-option

?/span>CREATE TABLE语句中包括所?/span>MySQL表选项

--disable-keys / -K

对于每个表,?/span>ALTER TABLE tbl_name DISABLE KEYS;?/span>ALTER TABLE tbl_name ENABLE KEYS;语句引用INSERT语句。因为在插入所有行后创建烦引,所以这样可以更快地装蝲转储文gQ该选项只适合MyISAM表?/span>

--extended-insert / -e

默认开启,使用包括几个VALUES的多?/span>INSERT语法。这样转储文g更小Q重载文件时可以加速插?/span>

--lock-tablesQ?/span>-l

开始{储前锁定所有表。用READ LOCAL锁定表以允许q行插入MyISAM表。对于事务表例如InnoDB?/span>BDBQ?/span>--single-transaction是一个更好的选项Q因为它不根本需要锁定表?/span>

--quickQ?/span>-q

该选项用于转储大的表。它强制mysqldump从服务器一ơ一行地索表中的行而不是检索所有行q在输出前将它缓存到内存?/span>

--set-charset

?/span>SET NAMES default_character_set加到输出中。该选项默认启用。要想禁?/span>SET NAMES语句Q?/span>--skip-set-charset

=====================================================================================

--complete-insert / -c

使用包括列名的完整的INSERT语句

--single-transaction

该选项从服务器转储数据之前发出一?/span>BEGIN SQL语句。它只适用于事务表Q例?/span>InnoDB?/span>BDBQ因为然后它在发出BEGIN而没有阻塞Q何应用程序时转储一致的数据库状态?/span>

当用该选项Ӟ应记住只?/span>InnoDB表能以一致的状态被转储。例如,使用该选项时Q何{储的MyISAM?/span>HEAP表仍然可以更改状态?/span>

--single-transaction选项?/span>--lock-tables选项是互斥的Q因?/span>LOCK TABLES会M挂v的事务隐含提交?/span>要想转储大的表,应结?/span>--quick使用该选项

--lock-all-tablesQ?/span>-x

所有数据库中的所有表加锁。在整体转储q程中通过全局读锁定来实现。该选项自动关闭--single-transaction?/span>--lock-tables

--hex-blob

使用十六q制W号转储二进制字W串?/span>(例如Q?/span>'abc' 变ؓ0x616263)。媄响到的列?/span>BINARY?/span>VARBINARY?/span>BLOB



]]>
数据库添加字D?/title><link>http://www.shnenglu.com/guojingjia2006/archive/2012/08/01/185870.html</link><dc:creator>果?/dc:creator><author>果?/author><pubDate>Wed, 01 Aug 2012 04:27:00 GMT</pubDate><guid>http://www.shnenglu.com/guojingjia2006/archive/2012/08/01/185870.html</guid><wfw:comment>http://www.shnenglu.com/guojingjia2006/comments/185870.html</wfw:comment><comments>http://www.shnenglu.com/guojingjia2006/archive/2012/08/01/185870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/guojingjia2006/comments/commentRss/185870.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guojingjia2006/services/trackbacks/185870.html</trackback:ping><description><![CDATA[<div>通用式: alter table [表名] add [字段名] 字段属?default ~省?default 是可选参?br />增加字段Q?alter table [表名] add 字段?smallint default 0 增加数字字段Q整型,~省gؓ0 <br />alter table [表名] add 字段?int default 0 增加数字字段Q长整型Q缺省gؓ0<br />alter table [表名] add 字段?single default 0 增加数字字段Q单_ֺ型,~省gؓ0 <br />alter table [表名] add 字段?double default 0 增加数字字段Q双_ֺ型,~省gؓ0<br />alter table [表名] add 字段?Tinyint default 0 增加数字字段Q字节型Q缺省gؓ0<br /><br />alter table [表名] add 字段?text [null] 增加备注型字D?[null]可选参?br />alter table [表名] add 字段?memo [null] 增加备注型字D?[null]可选参?br /><br />alter table [表名] add 字段?varchar(N) [null] 增加变长文本型字D?大小 为N(1?55)<br />alter table [表名] add 字段?char [null] 增加定长文本型字D?大小固定?55<br /><br />alter table [表名] add 字段?Datetime default 函数 增加日期型字D,其中 函数 可以?now(),date(){,表示~省?br />(上面都是最常用的,q有其他的属性,可以参考下面的数据cd描述)<br /><br />删除字段Q?alter table [表名] drop 字段?br /><br />修改变长文本型字D늚大小Qalter table [表名] alter 字段?varchar(N) <br /><br />删除表: drop table [表名]<br /><br />创徏表:<br />sql="CREATE TABLE [表名] ([字段1,q设|ؓ主键] int IDENTITY (1, 1) NOT NULL CONSTRAINT PrimaryKey PRIMARY KEY,"&_<br />"[字段2] varchar(50),"&_<br />"[字段3] single default 0,"&_<br />"[字段4] varchar(100) null,"&_<br />"[字段5] smallint default 0,"&_<br />"[字段6] int default 0,"&_<br />"[字段7] date default date(),"&_<br />"[字段8] int default 1)"<br />conn.execute sql<br /><br />有null 的表C字D允讔R?/div><img src ="http://www.shnenglu.com/guojingjia2006/aggbug/185870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guojingjia2006/" target="_blank">果?/a> 2012-08-01 12:27 <a href="http://www.shnenglu.com/guojingjia2006/archive/2012/08/01/185870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysqldumphttp://www.shnenglu.com/guojingjia2006/archive/2012/08/01/185869.html果?/dc:creator>果?/author>Wed, 01 Aug 2012 04:23:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2012/08/01/185869.htmlhttp://www.shnenglu.com/guojingjia2006/comments/185869.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2012/08/01/185869.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/185869.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/185869.html

命o行下具体用法如下Q?nbsp;

mysqldump -u用戶?-p密码 -d 数据库名 表名 > 脚本?

 

 

导出整个数据库结构和数据
mysqldump -h localhost -uroot -p123456 database > dump.sql

 

导出单个数据表结构和数据
mysqldump -h localhost -uroot -p123456  database table > dump.sql

 

 

导出整个数据库结构(不包含数据)
mysqldump -h localhost -uroot -p123456  -d database > dump.sql

 

导出单个数据表结构(不包含数据)
mysqldump -h localhost -uroot -p123456  -d database table > dump.sql



]]>
mysql 触发?/title><link>http://www.shnenglu.com/guojingjia2006/archive/2012/01/16/164247.html</link><dc:creator>果?/dc:creator><author>果?/author><pubDate>Mon, 16 Jan 2012 05:04:00 GMT</pubDate><guid>http://www.shnenglu.com/guojingjia2006/archive/2012/01/16/164247.html</guid><wfw:comment>http://www.shnenglu.com/guojingjia2006/comments/164247.html</wfw:comment><comments>http://www.shnenglu.com/guojingjia2006/archive/2012/01/16/164247.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/guojingjia2006/comments/commentRss/164247.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guojingjia2006/services/trackbacks/164247.html</trackback:ping><description><![CDATA[<div class="bzjbpfx" id="blog_text" class="cnt"><font size="5">1   引言<br /><br /></font>Mysql的触发器和存储过E一P都是嵌入到mysql的一D늨序。触发器是mysql5新增的功能,目前U上凤lpȝ、北斗系l以及哥伦布pȝ使用的数据库均是mysql5.0.45版本Q很多程序比如fc-star理端,sfrd(das)Qdorado都会用到触发器程序,实现对于数据库增、删、改引v事g的关联操作。本文介l了触发器的cd和基本用方法,讲述了触发器使用中容易生的误区Q从mysql源码中得到触发器执行序的结论,本文最后是实战遭遇的触发器l典案例。没有特D说明时Q本文的实验均基于mysql5.0.45版本?br /><br /><font size="5">2   Mysql触发器的cd</font><br /><br /><font size="4">2.1   Mysql触发器的基本使用</font><br /><br />创徏触发器。创发器语法如下Q?br /><br />CREATE TRIGGER trigger_name trigger_time trigger_event<br />ON tbl_name FOR EACH ROW trigger_stmt<br /><br />其中trigger_name标识触发器名Uͼ用户自行指定Q?br /><br />trigger_time标识触发时机Q用before和after替换Q?br /><br />trigger_event标识触发事gQ用insertQupdate和delete替换Q?br /><br />tbl_name标识建立触发器的表名Q即在哪张表上徏立触发器Q?br /><br />trigger_stmt是触发器E序体;触发器程序可以用begin和end作ؓ开始和l束Q中间包含多条语句;<br /><br />下面l出sfrd一个触发器实例Q?br /><br /><font color="#bf9000">CREATE /*!50017 DEFINER = 'root'@'localhost' */ TRIGGER trig_useracct_update<br />AFTER UPDATE<br />ON SF_User.useracct FOR EACH ROW<br />BEGIN<br />IF OLD.ulevelid = 10101 OR OLD.ulevelid = 10104 THEN<br />IF NEW.ulevelid = 10101 OR NEW.ulevelid = 10104 THEN<br />if NEW.ustatid != OLD.ustatid OR NEW.exbudget != OLD.exbudget THEN<br />INSERT into FC_Output.fcevent set type = 2, tabid = 1, level = 1, userid = NEW.userid, ustatid = NEW.ustatid, exbudget = NEW.exbudget;<br />end if;<br />ELSE<br />INSERT into FC_Output.fcevent set type = 1, tabid = 1, level = 1, userid = NEW.userid, ustatid = NEW.ustatid, exbudget = NEW.exbudget;<br />END IF;<br />END IF;<br />END;</font><br /><br />上述触发器实例用了OLD关键字和NEW关键字。OLD和NEW可以引用触发器所在表的某一列,在上q实例中QOLD.ulevelid表示?SF_User.useracct修改之前ulevelid列的|NEW.ulevelid表示表SF_User.useracct修改之后 ulevelid列的倹{另外,如果是insert型触发器QNEW.ulevelid也表CSF_User.useracct新增行的 ulevelid列|如果是delete型触发器OLD.ulevelid也表CSF_User.useracct删除行的ulevelid列原倹{?br /><br />另外QOLD列是只读的,NEW列则可以在触发器E序中再ơ赋倹{?br /><br />上述实例也用了IFQTHEN QELSEQEND IF{关键字。在触发器程序体中,在beigin和end之间Q可以用顺序,判断Q@环等语句Q实C般程序需要的逻辑功能?br /><br />查看触发器。查看触发器语法如下Q如果知道触发器所在数据库Q以及触发器名称{具体信息:<br /><font color="#bf9000"><br />SHOW TRIGGERS from SF_User like "usermaps%";</font>       //查看SF_User库上名称和usermaps%匚w的触发器<br /><br />如果不了解触发器的具体的信息Q或者需要查看数据库上所有触发器Q如下:<br /><br /><font color="#bf9000">SHOW TRIGGERS;</font>       //查看所有触发器<br /><br />用上q方式查看触发器可以看到数据库的所有触发器Q不q如果一个库上的触发器太多,׃会刷屏,可能没有办法查看所有触发器E序。这Ӟ可以采用如下方式Q?br /><br />Mysql中有一个information_schema.TRIGGERS表,存储所有库中的所有触发器Qdesc information_schema. TRIGGERSQ可以看到表l构Q?br /><br />+----------------------------+--------------+------+-----+---------+-------+<br />| Field                      | Type         | Null | Key | Default | Extra |<br />+----------------------------+--------------+------+-----+---------+-------+<br />| TRIGGER_CATALOG            | varchar(512) | YES |     | NULL    |       | <br />| TRIGGER_SCHEMA             | varchar(64) | NO   |     |         |       | <br />| TRIGGER_NAME               | varchar(64) | NO   |     |         |       | <br />| EVENT_MANIPULATION         | varchar(6)   | NO   |     |         |       | <br />| EVENT_OBJECT_CATALOG       | varchar(512) | YES |     | NULL    |       | <br />| EVENT_OBJECT_SCHEMA        | varchar(64) | NO   |     |         |       | <br />| EVENT_OBJECT_TABLE         | varchar(64) | NO   |     |         |       | <br />| ACTION_ORDER               | bigint(4)    | NO   |     | 0       |       | <br />| ACTION_CONDITION           | longtext     | YES |     | NULL    |       | <br />| ACTION_STATEMENT           | longtext     | NO   |     |         |       | <br />| ACTION_ORIENTATION         | varchar(9)   | NO   |     |         |       | <br />| ACTION_TIMING              | varchar(6)   | NO   |     |         |       | <br />| ACTION_REFERENCE_OLD_TABLE | varchar(64) | YES |     | NULL    |       | <br />| ACTION_REFERENCE_NEW_TABLE | varchar(64) | YES |     | NULL    |       | <br />| ACTION_REFERENCE_OLD_ROW   | varchar(3)   | NO   |     |         |       | <br />| ACTION_REFERENCE_NEW_ROW   | varchar(3)   | NO   |     |         |       | <br />| CREATED                    | datetime     | YES |     | NULL    |       | <br />| SQL_MODE                   | longtext     | NO   |     |         |       | <br />| DEFINER                    | longtext     | NO   |     |         |       | <br />+----------------------------+--------------+------+-----+---------+-------+<br /><br />q样Q用户就可以按照自己的需要,查看触发器,比如使用如下语句查看上述触发器:<br /><br /><font color="#bf9000">select * from information_schema. TRIGGERS where TRIGGER_NAME= 'trig_useracct_update'\G;</font><br /><br />删除触发器。删除触发器语法如下Q?br /><font color="#bf9000"><br />DROP TRIGGER [schema_name.]trigger_name</font><br /><br /><font size="4">2.2   Msyql触发器的trigger_time和trigger_event</font><br /><br />现在Q重新注意到trigger_time和trigger_eventQ上文说q, trigger_time可以用before和after替换Q表C发器E序的执行在sql执行的前q是后;trigger_event可以?insertQupdateQdelete替换Q表C发器E序在什么类型的sql下会被触发?br /><br />在一个表上最多徏?个触发器Q即1Qbefore insert型,2Qbefore update型,3Qbefore delete型,4Qafter insert型,5Qafter update型,6Qafter delete型?br /><br />触发器的一个限制是不能同时在一个表上徏?个相同类型的触发器。这个限制的一个来源是触发器程序体?#8220;begin和end之间允许q行多个语句”Q摘自mysql使用手册Q?br /><br />另外q有一炚w要注意,msyql除了对insertQupdateQdelete基本操作q行定义外,q定义了load data和replace语句Q而load data和replace语句也能引v上述6中类型的触发器的触发?br /><br />Load data语句用于一个文件装入到一个数据表中,相当与一pdinsert操作。replace语句一般来说和insert语句很像Q只是在表中?primary key和unique索引Ӟ如果插入的数据和原来primary key和unique索引一致时Q会先删除原来的数据Q然后增加一条新数据Q也是_一条replace sql有时候等价于一条insert sqlQ有时候等价于一条delete sql加上一条insert sql。即是:<br />?   Insert型触发器Q可能通过insert语句Qload data语句Qreplace语句触发Q?br />?   Update型触发器Q可能通过update语句触发Q?br />?   Delete型触发器Q可能通过delete语句Qreplace语句触发Q?br /><br /><font size="5">3   Mysql触发器的执行序</font><br /><br />先抛发器相关的几个问?br /><br /><font size="4">3.1   如果beforecd的触发器E序执行p|Qsql会执行成功吗Q?/font><br /><br />实验如下Q?br /><br />1Q在FC_Word.planinfo中徏立before触发器:<br /><br /><font color="#bf9000">DELIMITER |<br />create trigger trigger_before_planinfo_update<br />before update<br />ON FC_Word.planinfo FOR EACH ROW<br />BEGIN<br />insert into FC_Output.abc (planid) values (New.planid);<br />END</font><br />|<br /><br />2Q查看:mysql> select showprob from planinfo where planid=1;<br /><br />+----------+<br />| showprob |<br />+----------+<br />|        2 | <br />+----------+<br /><br />3Q执行sqlQ?br /><br /><font color="#bf9000">update planinfo set showprob=200 where planid=1;</font>      触发触发器程序;<br /><br />4Q由于不存在FC_Output.abcQbefore触发器执行失败,提示Q?br /><br />ERROR 1146 (42S02): Table 'FC_Output.abc' doesn't exist<br /><br />5Q再ơ查看:<br /><br />mysql> select showprob from planinfo where planid=1;<br />+----------+<br />| showprob |<br />+----------+<br />|        2 | <br />+----------+<br /><br />即修改sql未执行成功。即如果before触发器执行失败,sql也会执行p|?br /><br /><font size="4">3.2   如果sql执行p|Q会执行aftercd的触发器E序吗?</font><br /><br />实验如下Q?br /><br />1Q在FC_Word.planinfo中徏立after触发器:<br /><br /><font color="#bf9000">DELIMITER |<br />create trigger trigger_after_planinfo_update<br />after update<br />ON FC_Word.planinfo FOR EACH ROW<br />BEGIN<br />INSERT INTO FC_Output.fcevent set level = 2, type = 2, tabid = 5, userid = NEW.userid, planid = NEW.planid, planstat2 = NEW.planstat2, showprob = NEW.showprob, showrate = NEW.showrate, showfactor = NEW.showfactor, planmode = NEW.planmode;<br />END</font><br />|<br /><br />2Q查看触发表Q?br /><br />mysql> select * from FC_Output.fcevent where planid=1;<br />Empty set (0.00 sec)<br /><br />没有planid=1的记?br /><br />3Q执行sqlQ?br /><br />mysql> update planinfo set showprob1=200 where planid=1;<br /><br />4Q由于不存在showprob1列,提示错误Q?br /><br />ERROR 1054 (42S22): Unknown column 'showprob1' in 'field list'<br /><br />5Q再ơ查看触发表Q?br /><br />mysql> select * from FC_Output.fcevent where planid=1;<br />Empty set (0.00 sec)<br /><br />触发表中没有planid=1的记录,sql在执行失败时Qafter型触发器不会执行?br /><br /><font size="4">3.3   如果aftercd的触发器E序执行p|Qsql会回滚吗Q?/font><br /><br />实验如下Q?br /><br />1Q在FC_Word.planinfo中徏立after触发器:<br /><font color="#bf9000"><br />DELIMITER |<br />create trigger trigger_after_planinfo_update<br />after update<br />ON FC_Word.planinfo FOR EACH ROW<br />BEGIN<br />insert into FC_Output.abc (planid) values (New.planid);<br />END<br />|</font><br /><br />2Q查看:mysql> select showprob from planinfo where planid=1;<br /><br />+----------+<br />| showprob |<br />+----------+<br />|        2 | <br />+----------+<br /><br />3Q执行sqlQ?br /><br />update planinfo set showprob=200 where planid=1;触发触发器程序;<br /><br />4Q由于不存在FC_Output.abcQafter触发器执行失败,提示Q?br /><br />ERROR 1146 (42S02): Table 'FC_Output.abc' doesn't exist<br /><br />5Q再ơ查看:<br /><br />mysql> select showprob from planinfo where planid=1;<br />+----------+<br />| showprob |<br />+----------+<br />|        2 | <br />+----------+<br /><br />即修改sql未执行成功。即如果after触发器执行失败,sql会回滚?br /><br />q里需要说明一下,上述实验所使用的mysql引擎是innodbQinnodb引擎也是目前U上凤lpȝ、北斗系l以及哥伦布pȝ所使用的引擎,?innodb上所建立的表是事务性表Q也是事务安全的?#8220;对于事务性表Q如果触发程序失败(以及由此D的整个语句的p|Q,该语句所执行的所有更改将回滚。对于非事务性表Q不能执行这cd?#8221;Q摘自mysql使用手册Q。因而,即语句p|Q失败之前所作的M更改依然有效Q也是_对于 innodb引擎上的数据表,如果触发器中的sql或引发触发器的sql执行失效Q则事务回滚Q所有操作会失效?br /><font size="4"><br />3.4   mysql触发器程序执行的序</font><br /><br />当一个表既有beforecd的触发器Q又有aftercd的触发器Ӟ当一条sql语句涉及多个表的updateӞsql、触发器的执行顺序经qmysql源码包装q,有时比较复杂?br /><br />可以先看一Dmysql的源代码Q当SQL中update多表的时候,Mysql的执行过E如下(省去了无关代码)Q?br /><br /><font color="#bf9000">/* 遍历要更新的所有表 */<br />for (cur_table= update_tables; cur_table; cur_table= cur_table->next_local)<br />{<br />org_updated = updated<br />/* 如果?BEFORE 触发器,则执行;如果执行p|Q蟩到err2位置 */<br />if (table->triggers && <br />table->triggers->process_triggers(thd, TRG_EVENT_UPDATE,TRG_ACTION_BEFORE, TRUE))<br />goto err2;<br />/*执行更新Q如果更新失败,跛_err位置*/<br />if(local_error=table->file->update_row(table->record[1], table->record[0])))<br />goto err;<br />updated++; // 更新计数?br />/* 如果?AFTER 触发器,则执行;如果执行p|Q蟩到err2位置*/<br />if (table->triggers &&<br />table->triggers->process_triggers(thd, TRG_EVENT_UPDATE, TRG_ACTION_AFTER, TRUE))<br />goto err2;<br />err:<br />{<br />/*标志错误信息Q写日志{?/<br />}<br />err2:<br />{<br />/*恢复执行q的操作*/<br />check_opt_it.rewind();<br />/*如果执行了更斎ͼ且表是有事务的,做标?/<br />if (updated != org_updated)<br />{<br />if (table->file->has_transactions())<br />transactional_tables= 1;<br />}<br />}<br />}</font><br /><br />从上面代码可以找到本章开始时抛出问题的答案?br /><br />1Q?nbsp;  如果before型触发器执行p|Q直接goto跛_err2位置Q不会执行后lsql语句Q?br /><br />2Q?nbsp;  如果sql执行p|Q直接goto跛_err位置Q不会执行或许的after型触发器Q?br /><br />3Q?nbsp;  如过after触发器执行失败,goto到err2位置Q恢复执行过的操作,且在事务型的表上做标记?br /><br />另外Q在使用复杂的sqlӞ׃有些复杂的sql是mysql自己定义的,所以存在不定性,使用单的sql比较可控?br /><br /><font size="5">4   Mysql触发器在数据库同步中的表?/font><br /><br /><font size="4">4.1   触发器运行失败时Q数据库同步会失败吗Q?/font><br /><br />有同步关pd下dbA?dbB。初始时同步正常?br /><br />1Q在dbB上徏立触发器Q?br /><font color="#bf9000"><br />DELIMITER |<br />create trigger trigger_after_planinfo_update<br />after update<br />ON FC_Word.planinfo FOR EACH ROW<br />BEGIN<br />insert into FC_Output.abc (planid) values (New.planid);<br />END<br />|</font><br /><br />2Q在dbA上执行sqlQ执行成功;<br /><br />mysql> <font color="#bf9000">update planinfo set showprob=200 where planid= 1;</font><br />Query OK, 1 row affected (0.00 sec)<br />Rows matched: 1 Changed: 1 Warnings: 0<br /><br />3Q由于dbB上没有FC_Output.abc表,触发器会执行p|Q这Ӟ查一下同步状态:<br /><br />Slave_IO_Running: Yes<br />Slave_SQL_Running: NO<br />Last_Errno: 1146<br />Last_Error: Error 'Table 'FC_Output.abc' doesn't exist' on query. Default database: 'FC_Word'. Query: 'update planinfo set showprob=200 where planid= 1'<br /><br />可以看到IOU程q行正常QsqlU程q行p|Qƈ提示触发器运行失败的错误信息?br /><br />回忆一?.1?.3所q部分,无论是before部分的触发器q是aftercd的触发器Q对于innodb引擎Q当触发器执行失败时Q相应sql也会执行p|Q所以数据库同步也会p|?br /><br /><font size="4">4.2   创徏、删除触发器写bin-log</font><br /><br />创徏和删除触发器的语句也会写入bin-log里,所以也会如一般的insertQupdateQdelete语句一样同步到下游数据库中Q即上游创徏触发器,下游也会创徏?br /><br />q里再引Z个小问题Q有同步关系dbA?dbBQ?br /><br />1Q?nbsp;  在dbA上创Z个触发器Q如果dbB上已l有同表同类型的触发器,同步状态如何?<br /><br />2Q?nbsp;  在dbB上删除一个触发器Q如果dbB上没有对应触发器Q同步状态如何?<br /><br />q两个问题可以类比同步中的insert语句和delete语句Q答案就?br /><br />1Q?nbsp;  同步p|Q因Z允许重复创徏同表同类型的触发器;<br /><br />2Q?nbsp;  同步正常Q因为drop一个不存在的触发器Q不影响q行l果Q?br /><br /><font size="5">5   Mysql触发器经典案?/font><br /><br /><font size="4">5.1   案例1 一条sql涉及多个表的updateӞ触发得到update之前的旧?/font><br /><br />【现象】表test_info上徏有触发器如下Q?br /><font color="#bf9000"><br />CREATE /*!50017 DEFINER = 'root'@'localhost' */ TRIGGER trig_test_info_update<br />AFTER UPDATE<br />ON FC_Word.test_info FOR EACH ROW<br />BEGIN<br />DECLARE tlevel INTEGER DEFAULT 0;<br />DECLARE ttype INTEGER DEFAULT 0;<br />SET tlevel = 4;<br />SET ttype = 33;<br />INSERT INTO TEST_Output.fcevent (te, le, uid, pid, uid, wid, bi, mbid, wl) SELECT ttype, tlevel, NEW.uid, NEW.pid, NEW.uid, NEW.wid, NEW.bi, NEW.mbid, wl FROM TEST_Word.wext2 where wid = NEW.wid;<br />/*。。。其余部分逻辑省略*/<br />END IF;<br />END;</font><br /><br />q个触发器程序有炚wQ可以单看飘黄的两句Q即更新操作满W一个条件执行飘黄语句时Q触发器的行为。触发器是徏立在test_info表上的,飘黄语句中可以看刎ͼ也需要查询wext2表?br /><br />执行如下sql1Q?<br /><br />Update test_info a, wext2 b set a.th=(a.th+1), a.w4=(a.w4&8), b.wl=NULL where a.wid=b.wid and a.wid=142394379;<br /><br />可以看到sql中既修改了test_info2表,同时修改了wext2表,E序原意是触发得到wext2表wl字段修改后的新|即NULLQ;不过实验得到Q执行上qsql后,触发器程序查询到的wurl是sql修改之前的旧倹{?br /><br />再执行下面类似sql2Q?br /><br />Update wext2 a, test_info2 b set b.th=(b.th+1), b.w4=(b.w4&8), a.wl=NULL where a.wid=b.wid and a.wid=142394379;<br /><br />实验的到Q执行上qsql后,触发器程序查询到的wurl是sql修改之后的新倹{?br /><br />【原因】原因当然与sql中的别名aQb无关Q而是和wext2表和test_info表的书写序有关。如本文3.4部分所qͼ一条sql涉及多个表的 update操作Ӟ数据表字Dc触发器执行序是mysql源码包装q的。在执行上述sql1Ӟ先执行test_info的更斎ͼ然后是after触发器,最后是wext2的更斎ͼ也就是说Q在执行after触发器时Qwext2q没有进行更斎ͼ所以触发得到的是旧倹{而执行sql2Ӟ先执?wext2更新Q然后是test_info更新Q最后是after触发器,也就是说Q在执行after触发器时Qwext2已经更新完毕Q所以出d到的是新倹{?br /><br />引v上述现象是顺序关pȝQ无表是否支持事务。在使用复杂的sqlӞ׃有些复杂的sql是mysql自己定义的,所以存在不定性,存在风险Q用简单的sql比较可控?br /><br /><font size="4">5.2   案例2 mysql5.0.19版本修改表结构后触发器失?/font><br /><br />【现象】userpref表上建有aftercd触发器,修改userpref表的外键兌后,在userpref表中的新增记录没有触发下来,卌发器失效?br /><br />【原因】mysql5.0.19修改表结构是Q触发器消失。这是mysql5.0.19的一个bugQ在创徏触发器时Q会把触发器的内容保存在 information_schema.TRIGGERS表中Q同时在var目录下创发器的数据库目录下创Z个触发器名称为前~Q以TRN为后~的文Ӟ当修改触发器的表Ӟinformation_schema.TRIGGERS表的内容会删除,D触发器消失?br /><br />在mysql5.0.45版本中,q个bug已经被修复。Mysql5.0.45版本的触发器Q无论是修改表的索引、外键,q是改变表字D,触发器都不会失效?br /><br /><font size="4">5.3   案例3 删除数据表后触发器失?/font><br /><br />【现象】联调环境中存在dbA?dbBQ主库dbA上没有触发器Q在从库dbB上的FC_Word.wnegative表,FC_Word.wbuget 表上建有触发器;触发器开始运行正常,期间没有对从库的M直接操作Q有一日发现对wnegative表上的修Ҏ法触发。查看从库状态,同步正常Q用 select TRIGGER_NAME from information_schema.TRIGGERS发现wnegative表上的触发器消失了;在var/FC_Word目录下也没有 wnegative?TRN文gQwnegative表上的触发器不见了?br /><br />【分析】查找dbB的查询日志,发现有一条:<br /><br />100223 18:27:45 135939 Query       DROP TABLE IF EXISTS `wnegative`<br />135939 Query       CREATE TABLE `wnegative` (<br />KEY `Index_wnegative_planid` (`planid`),<br />KEY `Index_wnegative_unitid` (`unitid`)<br />135939 Query       /*!40000 ALTER TABLE `wnegative` DISABLE KEYS */<br />100223 18:27:46 135939 Query       INSERT INTO `wnegative` VALUES (614,1,289026,2911155,1848481);<br /><br />可以看到Q在100223 18:27:45Ӟ删除了表wnegativeQ紧接着有创wnegativeQ查找触发表发现Q在100223 18:27:45旉后对wnegative的修改就没有触发了,而在q个之前对wnegative的修Ҏ触发正常的。故Q怀疑对wnegative表的删除使wnegative表上的触发器也被删除。对wnegative表的删除是在ddbA上操作后Q被同步到dbB上?br /><br />【原因】在删除wnegative表时Qmysql同时删除了wegative表上的触发器?br /><br />可以通过下面实验证明上述猜测Q?br /><br />1Q?nbsp;  首先在wnegative建立after insert型触发器Q?br />2Q?nbsp;  增加一条wnegative中记录;<br />3Q?nbsp;  查看l果发现触发器正触发;<br />4Q?nbsp;  删除wnegative表;<br />5Q?nbsp;  使用select TRIGGER_NAME from information_schema.TRIGGERS查看所有触发器Qwnegative表上触发器已l不存在了;同时到var/FC_Word目录下,对应触发器的.TRN文g也不存在了;<br />6Q?nbsp;  重新创徏wnegative表,q增加一条wnegative中记录;没有了wnegative表上触发器,自然也不能触发Q何结果?br /><br /><font size="5">6   l束?/font><br /><br />Mysql中的触发器功能已l在凤lpȝ的各个模块中有广泛应用,I其l节Q还有很多值得注意的地方;本文建立在实验和案例的基上,数据库基于线上系l用的mysql5.0.45版本Q分析了触发器相关的一些特D情况下msyql的处理方式?br /><br />Q全文完Q?/div><br /><img src ="http://www.shnenglu.com/guojingjia2006/aggbug/164247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guojingjia2006/" target="_blank">果?/a> 2012-01-16 13:04 <a href="http://www.shnenglu.com/guojingjia2006/archive/2012/01/16/164247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql error 1045http://www.shnenglu.com/guojingjia2006/archive/2009/05/23/85547.html果?/dc:creator>果?/author>Sat, 23 May 2009 14:41:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2009/05/23/85547.htmlhttp://www.shnenglu.com/guojingjia2006/comments/85547.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2009/05/23/85547.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/85547.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/85547.htmlwindowspȝ下mysql出现Error 1045(28000) Access Denied for user 'root'@'localhost' (Using password:NO)错误解决Ҏ
      在windows操作pȝ安装mysql数据库,到Error 1045(28000) Access Denied for user 'root'@'localhost' (Using password:NO)错误Ӟ你需要重新设|密码?/div>
      具体Ҏ是:
      1.先在安装目录扑ֈmy.ini配置文gQ打开配置文gQ找到[mysqld]一行,在下面添加skip-grant-tables后保存该文gQ重新启mysql动服?




windows7下装了mysql5.1,error1045,删除实例后服务就启动不了Q试了很多方法都不能解决Q,最后重装了?.0的beta,出现刚装5.1时的初始错误error 1045最l错误解冻IQ感谢作者)
1、mysql -u root

2、use mysql

3、update user set password=old_password('scf') where user='root' and host='localhost' ;

4、FLUSH PRIVILEGES;

ok了试验一下!

需要整理一下mysql的主从备份的实现ҎQ?/p>

 



]]> 2021ƷþþƷ| ҰAVþһ| ˾ƷѾþþþ| þAVۺϺɫ| Ʒþþø| þŮƵ| þþþ| ޾ƷþþþþҲ| AƬٸþ| þˬˬƬav| ŷþۺ| ĻþþƷ| þseƷһƷ| ɫۺϾþþþĻ| þþѾƷre6| Ƶþ| ھƷþþӰԺ| þþþþüƷþþ | þù׾Ʒǿ| þĻԴվ| Ʒþþþþ | þþ뾫Ʒպý| ƷþþþjkƷ| AVһþ| 91Ʒ9lþþþ| һһþAþۺϾƷ | þó˾ƷƵ| 츾þþ| ޹һɾþþƷۺ | þݺҹҹ96׽ | þZYZԴվĶ| þþƷ޾Ʒŷ| 99þþƷӰԺѼ| þþþƷһ| պvavaŷvaþ| Ʒþþþþ99| 99þþƷֻоƷ | һƷþ| ĻƷѾþþ| þþƷ69Ʒ| þAVӰ|