建议收藏!Linux运维必备之nginxmysqlesmongodb实用笔记
nginx{ yum install -y make gcc openssl-devel pcre-devel bzip2-devel libxml2 libxml2-devel curl-devel libmcrypt-devel libjpeg libjpeg-devel libpng libpng-devel openssl groupadd nginx useradd nginx -g nginx -M -s /sbin/nologin mkdir -p /opt/nginx-tmp wget http://labs.frickle.com/files/ngx_cache_purge-1.6.tar.gz tar fxz ngx_cache_purge-1.6.tar.gz # ngx_cache_purge 清除指定url缓存 # 假设一个URL为 http://192.168.12.133/test.txt # 通过访问 http://192.168.12.133/purge/test.txt 就可以清除该URL的缓存。 tar zxvpf nginx-1.4.4.tar.gz cd nginx-1.4.4 # ./configure --help # --with # 默认不加载 需指定编译此参数才使用 # --without # 默认加载,可用此参数禁用 # --add-module=path # 添加模块的路径 # --add-module=/opt/ngx_module_upstream_check # nginx 代理状态页面 # ngx_module_upstream_check 编译前需要打对应版本补丁 patch -p1 < /opt/nginx_upstream_check_module/check_1.2.6+.patch # --add-module=/opt/ngx_module_memc # 将请求页面数据存放在 memcached中 # --add-module=/opt/ngx_module_lua # 支持lua脚本 yum install lua-devel lua ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_ssl_module --with-http_realip_module --with-http_gzip_static_module --with-http_stub_status_module --add-module=/opt/ngx_cache_purge-1.6 --http-client-body-temp-path=/opt/nginx-tmp/client --http-proxy-temp-path=/opt/nginx-tmp/proxy --http-fastcgi-temp-path=/opt/nginx-tmp/fastcgi --http-uwsgi-temp-path=/opt/nginx-tmp/uwsgi --http-scgi-temp-path=/opt/nginx-tmp/scgi make && make install /usr/local/nginx/sbin/nginx –t # 检查Nginx配置文件 但并不执行 /usr/local/nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf # 检查Nginx配置文件 /usr/local/nginx/sbin/nginx # 启动nginx /usr/local/nginx/sbin/nginx -s reload # 重载配置 /usr/local/nginx/sbin/nginx -s stop # 关闭nginx服务 }
elasticsearch{ vim /etc/sysctl.conf vm.max_map_count = 262144 vim /etc/security/limits.conf * soft memlock unlimited * hard memlock unlimited sysctl -p curl "localhost:9200/_cat/health?v" # 健康检查 curl "localhost:9200/_cat/nodes?v" # 获取集群的节点列表 curl "localhost:9200/_cat/indices?v" # 列出所有索引 curl 127.0.0.1:9200/indexname -XDELETE # 删除索引 curl -XGET http://localhost:9200/_cat/shards # 查看分片 curl "127.0.0.1:9200/_cat/indices" # 查分片同步 unassigned_shards # 没同步完成 } mysql常用命令{ # mysql 可视化工具 MySQL Workbench mysqlcheck -uroot -p -S mysql.sock --optimize --databases account # 检查、修复、优化MyISAM表 mysqlbinlog slave-relay-bin.000001 # 查看二进制日志 mysqladmin -h myhost -u root -p create dbname # 创建数据库 flush privileges; # 刷新 show databases; # 显示所有数据库 use dbname; # 打开数据库 show tables; # 显示选中数据库中所有的表 desc tables; # 查看表结构 drop database name; # 删除数据库 drop table name; # 删除表 create database name; # 创建数据库 select column from table; # 查询 show processlist; # 查看mysql进程 show full processlist; # 显示进程全的语句 select user(); # 查看所有用户 show slave statusG; # 查看主从状态 show variables; # 查看所有参数变量 show status; # 运行状态 show table status # 查看表的引擎状态 show grants for user@"%" # 查看用户权限 drop table if exists user # 表存在就删除 create table if not exists user # 表不存在就创建 select host,user,password from user; # 查询用户权限 先use mysql create table ka(ka_id varchar(6),qianshu int); # 创建表 show variables like "character_set_%"; # 查看系统的字符集和排序方式的设定 show variables like "%timeout%"; # 查看超时相关参数 delete from user where user=""; # 删除空用户 delete from user where user="sss" and host="localhost" ; # 删除用户 drop user "sss"@"localhost"; # 使用此方法删除用户更为靠谱 ALTER TABLE mytable ENGINE = MyISAM ; # 改变现有的表使用的存储引擎 SHOW TABLE STATUS from dbname where Name="tablename"; # 查询表引擎 mysql -uroot -p -A -ss -h10.10.10.5 -e "show databases;" # shell中获取数据不带表格 -ss参数 CREATE TABLE innodb (id int, title char(20)) ENGINE = INNODB # 创建表指定存储引擎的类型(MyISAM或INNODB) grant replication slave on *.* to "user"@"%" identified by "pwd"; # 创建主从复制用户 ALTER TABLE player ADD INDEX weekcredit_faction_index (weekcredit, faction); # 添加索引 alter table name add column accountid(column) int(11) NOT NULL(column); # 插入字段 update host set monitor_state="Y",hostname="xuesong" where ip="192.168.1.1"; # 更新数据 select * from information_schema.processlist where command!="sleep"; # 查看当前进程 select * from atable where name="on" AND t<15 AND host LIKE "10%" limit 1,10; # 多条件查询 show create database ops_deploy; # 查看数据库编码 show create table updatelog; # 查看数据库表编码 alter database ops_deploy CHARACTER SET utf8; # 修改数据库编码 alter table `updatelog` default character set utf8; # 修改表编码 alter table `updatelog` convert to character set utf8; # 修改一张表的所有字段的编码格式 自增表{ create table xuesong (id INTEGER PRIMARY KEY AUTO_INCREMENT, name CHAR(30) NOT NULL, age integer , sex CHAR(15) ); # 创建自增表 insert into xuesong(name,age,sex) values(%s,%s,%s) # 自增插入数据 } 登录mysql的命令{ # 格式: mysql -h 主机地址 -u 用户名 -p 用户密码 mysql -h110.110.110.110 -P3306 -uroot -p mysql -uroot -p -S /data1/mysql5/data/mysql.sock -A --default-character-set=GBK } shell执行mysql命令{ mysql -u root -p"123" xuesong < file.sql # 针对指定库执行sql文件中的语句,好处不需要转义特殊符号,一条语句可以换行.不指定库执行时语句中需要先use mysql -u$username -p$passwd -h$dbhost -P$dbport -A -e " use $dbname; delete from data where date=("$date1"); " # 执行多条mysql命令 mysql -uroot -p -S mysql.sock -e "use db;alter table gift add column accountid int(11) NOT NULL;flush privileges;" 2>&1 |grep -v Warning # 不登陆mysql插入字段 } mysql字符集相关{ show variables like "%character%"; # 查看数据库中设置字符集的参数 # character_set_client、character_set_connection 以及 character_set_results 这几个参数都是客户端的设置 # character_set_system、character_set_server 以及 character_set_database 是指服务器端的设置。 # 而对于这三个服务器端的参数来说的优先级是: # 列级字符集 > 表级字符集 > character_set_database > character_set_server > character_set_system show global variables like "%char%"; #查看RDS实例字符集相关参数设置 show global variables like "coll%"; #查看当前会话字符序相关参数设置 show character set; #查看实例支持的字符集 show collation; #查看实例支持的字符序 show create table table_name G #查看表字符集设置 show create database database_name G #查看数据库字符集设置 show create procedure procedure_name G #查看存储过程字符集设置 show procedure status G #查看存储过程字符集设置 alter database db_name default charset utf8; #修改数据库的字符集 create database db_name character set utf8; #创建数据库时指定字符集 alter table tab_name default charset utf8 collate utf8_general_ci; #修改表字符集和字符序 # 下面三条sql 分别将库 dbsdq , 表 tt2 , 表 tt2 中的 c2 列修改为utf8mb4 字符集 alter database dbsdq character set utf8mb4 collate utf8mb4_unicode_ci; use dbsdq; alter table tt2 character set utf8mb4 collate utf8mb4_unicode_ci; alter table tt2 modify c2 varchar(10) character set utf8mb4; # 修改列时,当前列中的所有行都会立即转化为新的字符集; # alter table 会对表加元数据锁 } 备份数据库{ mysqldump -h host -u root -p --default-character-set=utf8 dbname >dbname_backup.sql # 不包括库名,还原需先创建库,在use mysqldump -h host -u root -p --database --default-character-set=utf8 dbname >dbname_backup.sql # 包括库名,还原不需要创建库 /bin/mysqlhotcopy -u root -p # mysqlhotcopy只能备份MyISAM引擎 mysqldump -u root -p -S mysql.sock --default-character-set=utf8 dbname table1 table2 > /data/db.sql # 备份表 mysqldump -uroot -p123 -d database > database.sql # 备份数据库结构 # 最小权限备份 grant select on db_name.* to dbbackup@"localhost" Identified by "passwd"; # --single-transaction InnoDB有时间戳 只备份开始那一刻的数据,备份过程中的数据不会备份 mysqldump -hlocalhost -P 3306 -u dbbackup --single-transaction -p"passwd" --database dbname >dbname.sql # xtrabackup备份需单独安装软件 优点: 速度快,压力小,可直接恢复主从复制 innobackupex --user=root --password="" --defaults-file=/data/mysql5/data/my_3306.cnf --socket=/data/mysql5/data/mysql.sock --slave-info --stream=tar --tmpdir=/data/dbbackup/temp /data/dbbackup/ 2>/data/dbbackup/dbbackup.log | gzip 1>/data/dbbackup/db50.tar.gz } 还原数据库{ mysql -h host -u root -p dbname < dbname_backup.sql source 路径.sql # 登陆mysql后还原sql文件 } 赋权限{ # 指定IP: $IP 本机: localhost 所有IP地址: % # 通常指定多条 grant all on zabbix.* to user@"$IP"; # 对现有账号赋予权限 grant select on database.* to user@"%" Identified by "passwd"; # 赋予查询权限(没有用户,直接创建) grant all privileges on database.* to user@"$IP" identified by "passwd"; # 赋予指定IP指定用户所有权限(不允许对当前库给其他用户赋权限) grant all privileges on database.* to user@"localhost" identified by "passwd" with grant option; # 赋予本机指定用户所有权限(允许对当前库给其他用户赋权限) grant select, insert, update, delete on database.* to user@"ip"identified by "passwd"; # 开放管理操作指令 revoke all on *.* from user@localhost; # 回收权限 GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `storemisc_dev`.* TO "user"@"192.168.%" } 更改密码{ update user set password=password("passwd") where user="root" mysqladmin -u root password "xuesong" } mysql忘记密码后重置{ cd /data/mysql5 /data/mysql5/bin/mysqld_safe --user=mysql --skip-grant-tables --skip-networking & use mysql; update user set password=password("123123") where user="root"; } mysql主从复制失败恢复{ slave stop; reset slave; change master to master_host="10.10.10.110",master_port=3306,master_user="repl",master_password="repl",master_log_file="master-bin.000010",master_log_pos=107,master_connect_retry=60; slave start; } sql语句使用变量{ use xuesong; set @a=concat("my",weekday(curdate())); # 组合时间变量 set @sql := concat("CREATE TABLE IF NOT EXISTS ",@a,"( id INT(11) NOT NULL )"); # 组合sql语句 select @sql; # 查看语句 prepare create_tb from @sql; # 准备 execute create_tb; # 执行 } 检测mysql主从复制延迟{ 1、在从库定时执行更新主库中的一个timeout数值 2、同时取出从库中的timeout值对比判断从库与主库的延迟 } 死锁{ show OPEN TABLES where In_use > 0; # 查看当前锁信息 show variables like "innodb_print_all_deadlocks"; # 查看当前死锁参数 set global innodb_print_all_deadlocks = 1; # 设置死锁信息保存到错误日志 innodb_print_all_deadlocks = 1 # conf配置 } mysql慢查询{ select * from information_schema.processlist where command in ("Query") and time >5G # 查询操作大于5S的进程 开启慢查询日志{ # 配置文件 /etc/my.conf [mysqld] log-slow-queries=/var/lib/mysql/slowquery.log # 指定日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log long_query_time=5 # 记录超过的时间,默认为10s 建议0.5S log-queries-not-using-indexes # log下来没有使用索引的query,可以根据情况决定是否开启 可不加 log-long-format # 如果设置了,所有没有使用索引的查询也将被记录 可不加 # 直接修改生效 show variables like "%slow%"; # 查看慢查询状态 set global slow_query_log="ON"; # 开启慢查询日志 变量可能不同,看上句查询出来的变量 } mysqldumpslow慢查询日志查看{ -s # 是order的顺序,包括看了代码,主要有 c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒序 -t # 是top n的意思,即为返回前面多少条的数据 -g # 后边可以写一个正则匹配模式,大小写不敏感的 mysqldumpslow -s c -t 20 host-slow.log # 访问次数最多的20个sql语句 mysqldumpslow -s r -t 20 host-slow.log # 返回记录集最多的20个sql mysqldumpslow -t 10 -s t -g "left join" host-slow.log # 按照时间返回前10条里面含有左连接的sql语句 show global status like "%slow%"; # 查看现在这个session有多少个慢查询 show variables like "%slow%"; # 查看慢查询日志是否开启,如果slow_query_log和log_slow_queries显示为on,说明服务器的慢查询日志已经开启 show variables like "%long%"; # 查看超时阀值 desc select * from wei where text="xishizhaohua"G; # 扫描整张表 tepe:ALL 没有使用索引 key:NULL create index text_index on wei(text); # 创建索引 } Percona Toolkit 慢日志分析工具 } mysql操作次数查询{ select * from information_schema.global_status; com_select com_delete com_insert com_update } } mongodb{ # mongo可视管理工具 studio 3t 一、启动{ # 不启动认证 ./mongod --port 27017 --fork --logpath=/opt/mongodb/mongodb.log --logappend --dbpath=/opt/mongodb/data/ # 启动认证 ./mongod --port 27017 --fork --logpath=/opt/mongodb/mongodb.log --logappend --dbpath=/opt/mongodb/data/ --auth # 配置文件方式启动 cat /opt/mongodb/mongodb.conf port=27017 # 端口号 fork=true # 以守护进程的方式运行,创建服务器进程 auth=true # 开启用户认证 logappend=true # 日志采用追加方式 logpath=/opt/mongodb/mongodb.log # 日志输出文件路径 dbpath=/opt/mongodb/data/ # 数据库路径 shardsvr=true # 设置是否分片 maxConns=600 # 数据库的最大连接数 ./mongod -f /opt/mongodb/mongodb.conf # 其他参数 bind_ip # 绑定IP 使用mongo登录需要指定对应IP journal # 开启日志功能,降低单机故障的恢复时间,取代dur参数 syncdelay # 系统同步刷新磁盘的时间,默认60秒 directoryperdb # 每个db单独存放目录,建议设置.与mysql独立表空间类似 repairpath # 执行repair时的临时目录.如果没开启journal,出现异常重启,必须执行repair操作 # mongodb没有参数设置内存大小.使用os mmap机制缓存数据文件,在数据量不超过内存的情况下,效率非常高.数据量超过系统可用内存会影响写入性能 } 二、关闭{ # 方法一:登录mongodb ./mongo use admin db.shutdownServer() # 方法:kill传递信号 两种皆可 kill -2 pid kill -15 pid } 三、开启认证与用户管理{ ./mongo # 先登录 use admin # 切换到admin库 db.addUser("root","123456") # 创建用户 db.addUser("zhansan","pass",true) # 如果用户的readOnly为true那么这个用户只能读取数据,添加一个readOnly用户zhansan ./mongo 127.0.0.1:27017/mydb -uroot -p123456 # 再次登录,只能针对用户所在库登录 #虽然是超级管理员,但是admin不能直接登录其他数据库,否则报错 #Fri Nov 22 15:03:21.886 Error: 18 { code: 18, ok: 0.0, errmsg: "auth fails" } at src/mongo/shell/db.js:228 show collections # 查看链接状态 再次登录使用如下命令,显示错误未经授权 db.system.users.find(); # 查看创建用户信息 db.system.users.remove({user:"zhansan"}) # 删除用户 #恢复密码只需要重启mongodb 不加--auth参数 } 四、登录{ 192.168.1.5:28017 # http登录后可查看状态 mongo # 默认登录后打开 test 库 mongo 192.168.1.5:27017/databaseName # 直接连接某个库 不存在则创建 启动认证需要指定对应库才可登录 } 五、查看状态{ #登录后执行命令查看状态 db.runCommand({"serverStatus":1}) globalLock # 表示全局写入锁占用了服务器多少时间(微秒) mem # 包含服务器内存映射了多少数据,服务器进程的虚拟内存和常驻内存的占用情况(MB) indexCounters # 表示B树在磁盘检索(misses)和内存检索(hits)的次数.如果这两个比值开始上升,就要考虑添加内存了 backgroudFlushing # 表示后台做了多少次fsync以及用了多少时间 opcounters # 包含每种主要擦撞的次数 asserts # 统计了断言的次数 #状态信息从服务器启动开始计算,如果过大就会复位,发送复位,所有计数都会复位,asserts中的roolovers值增加 #mongodb自带的命令 ./mongostat insert #每秒插入量 query #每秒查询量 update #每秒更新量 delete #每秒删除量 locked #锁定量 qr|qw #客户端查询排队长度(读|写) ar|aw #活跃客户端量(读|写) conn #连接数 time #当前时间 mongostat -h 127.0.0.1 --port 27047 --authenticationDatabase admin -u zadmin -p Keaphh9e # 查看mongo状态 mongotop -h 127.0.0.1 --port 27047 --authenticationDatabase admin -u zadmin -p Keaphh9e # 查看mongo集合的统计数据 } 六、常用命令{ db.listCommands() # 当前MongoDB支持的所有命令(同样可通过运行命令db.runCommand({"listCommands" : `1})来查询所有命令) db.runCommand({"buildInfo" : 1}) # 返回MongoDB服务器的版本号和服务器OS的相关信息 db.runCommand({"collStats" : tablename}) # 返回该集合的统计信息,包括数据大小,已分配存储空间大小,索引的大小等 db.runCommand({"dropDatabase" : 1}) # 清空当前数据库的信息,包括删除所有的集合和索引 db.runCommand({"isMaster" : 1}) # 检查本服务器是主服务器还是从服务器 db.runCommand({"ping" : 1}) # 检查服务器链接是否正常。即便服务器上锁,该命令也会立即返回 db.runCommand({"repaireDatabase" : 1}) # 对当前数据库进行修复并压缩,如果数据库特别大,这个命令会非常耗时 db.runCommand({"serverStatus" : 1}) # 查看这台服务器的管理统计信息 # 某些命令必须在admin数据库下运行,如下两个命令: db.runCommand({"renameCollection" : 集合名, "to":集合名}) # 对集合重命名,注意两个集合名都要是完整的集合命名空间,如foo.bar, 表示数据库foo下的集合bar。 db.runCommand({"listDatabases" : 1}) # 列出服务器上所有的数据库 mongo 172.20.20.1:27072/mdb --eval "db.tb.count();" # shell执行mongo语句 mongo --host 172.20.20.1 --port 27049 rs.config(); # 查看集群配置 rs.status(); # 查看集群节点的状态 db.currentOp() # 获取当前正在执行的操作,可对应命令链接到ip:port db.runCommand( { logRotate : 1 } ) # 日志轮转 rs.slaveOk() # 设置从库shell可读 rs.addArb("172.16.10.199:27020"); # 添加仲裁节点 rs.add({host: "10.2.2.2:27047", priority: 0, hidden: true}) # 添加从节点 hidden true隐藏节点[priority必须为0] false不隐藏 rs.remove("172.20.80.216:27047"); # 删除节点 rs.stepDown(120) # 主库上执行切换为从,120秒后切换回主 show dbs # 查询db use post # 选择db show tables # 查看文档列表 db.tb.drop() # 删除集合 需要权限 db.tb.remove({}) # 删除所有数据 db.tb.count() # 查询文档条数 db.tb.find() # 查看文档内容 db.tb.find({_id:37530555}) # 查询指定id db.tb.find().sort({_id:-1}).limit(1) # 查询文档最后一条 db.tb.find({"processed" : {"$ne" : true}}).limit(1); # 字段不为 true db.tb.find({"processed" : {"$eq" : true}}).limit(1); # 字段为 true db.tb.find({"processed" : {"$exists" : false}}).limit(1); # 字段不存在 db.tb.ensureIndex({"status":1}, {background:true}) # 后台加索引 db.tb.getIndexes() # 查看索引 db.tb.ensureIndex({"c_type":1},{backgrounnd:true}) # 后台添加索引 1正向 -1反向 db.tb.dropIndex({"c_type":1}); # 删除索引 } 七、进程控制{ db.currentOp() # 查看活动进程 db.$cmd.sys.inprog.findOne() # 查看活动进程 与上面一样 opid # 操作进程号 op # 操作类型(查询更新) ns # 命名空间,指操作的是哪个对象 query # 如果操作类型是查询,这里将显示具体的查询内容 lockType # 锁的类型,指明是读锁还是写锁 db.killOp(opid值) # 结束进程 db.$cmd.sys.killop.findOne({op:opid值}) # 结束进程 } 八、备份还原{ # mongodump 虽然能不停机备份,但是为了获取实时数据视图的能力,使用fsync命令能在运行时复制数据目录并且不会损坏数据 # fsync会强制服务器将所有缓冲区的数据写入磁盘.配合lock还阻止对数据库的进一步写入,知道释放锁为止 db.runCommand({"fsync":1,"lock":1}) # 执行强制更新与写入锁 db.$cmd.sys.unlock.findOne() # 解锁 db.currentOp() # 查看解锁是否正常 mongoexport -d test -c t1 -o t1.dat # 导出JSON格式 -c # 指明导出集合 -d # 使用库 mongoexport -d test -c t1 -csv -f num -o t1.dat # 导出csv格式 -csv # 指明导出csv格式 -f # 指明需要导出那些例 mongoimport -d test -c t1 -file t1.dat # mongoimport还原JSON格式 mongoimport -d test -c t1 -type csv --headerline -file t1.dat # mongoimport还原csv格式数据 --headerline # 指明不导入第一行 因为第一行是列名 mongodump -d test -o /bak/mongodump # mongodump数据备份 mongorestore -d test --drop /bak/mongodump/* # mongorestore恢复 --drop # 恢复前先删除 --gzip # 压缩 # 备份一个表 # --excludeCollection string # 排除指定的集合 要排除多个,使用多个 mongodump --host 127.0.0.1:27080 -d dbname -c tablename -o /data/reports/ mongodump --host 127.0.0.1:27080 -d dbname -c tablename -o /data/reports/reports -u root -p tAvaa5yNUE --authenticationDatabase admin # 恢复一个表 mongorestore --host 127.0.0.1:27080 -d dbname -c tablename --drop --dir=/data/reports/tablename.bson # 在线拷贝一个库 db.copyDatabase(fromdb, todb, fromhost, username, password, mechanism) db.copyDatabase("mate","mate", "172.16.255.176:27047") } 九、修复{ # 当停电或其他故障引起不正常关闭时,会造成部分数据损坏丢失 mongod --repair # 修复操作:启动时候加上 --repair # 修复过程:将所有文档导出,然后马上导入,忽略无效文档.完成后重建索引。时间较长,会丢弃损坏文档 # 修复数据还能起到压缩数据库的作用 db.repairDatabase() # 运行中的mongodb可使用 repairDatabase 修复当前使用的数据库 {"repairDatabase":1} # 通过驱动程序 } 十、python使用mongodb{ easy_install pymongo # python2.7+ import pymongo connection=pymongo.Connection("localhost",27017) # 创建连接 db = connection.test_database # 切换数据库 collection = db.test_collection # 获取collection # db和collection都是延时创建的,在添加Document时才真正创建 文档添加, _id自动创建 import datetime post = {"author": "Mike", "text": "My first blog post!", "tags": ["mongodb", "python", "pymongo"], "date": datetime.datetime.utcnow()} posts = db.posts posts.insert(post) ObjectId("...") 批量插入 new_posts = [{"author": "Mike", "text": "Another post!", "tags": ["bulk", "insert"], "date": datetime.datetime(2009, 11, 12, 11, 14)}, {"author": "Eliot", "title": "MongoDB is fun", "text": "and pretty easy too!", "date": datetime.datetime(2009, 11, 10, 10, 45)}] posts.insert(new_posts) [ObjectId("..."), ObjectId("...")] 获取所有collection db.collection_names() # 相当于SQL的show tables 获取单个文档 posts.find_one() 查询多个文档 for post in posts.find(): post 加条件的查询 posts.find_one({"author": "Mike"}) 高级查询 posts.find({"date": {"$lt": "d"}}).sort("author") 统计数量 posts.count() 加索引 from pymongo import ASCENDING, DESCENDING posts.create_index([("date", DESCENDING), ("author", ASCENDING)]) 查看查询语句的性能 posts.find({"date": {"$lt": "d"}}).sort("author").explain()["cursor"] posts.find({"date": {"$lt": "d"}}).sort("author").explain()["nscanned"] } }