邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

MongoDB安全认证基础

开启安全检查之前,一定要至少有个管理员帐号
use admin
db.addUser("root","abcd");

use test
db.addUser("test_user","efgh");
db.addUser("read_only","ijkl",true);//加入 true 只读权限

重启服务,加入--atuh命令行选项,开启安全检查
use test
db.test.find(); //提示error:

db.auth("read_only","ijkl"); //返回1
db.test.find();  //返回数据
db.test.insert({"x":2}); // unauthhorized 

db.auth("test_user","efgh");//返回1
db.test.insert({"x":2}); //正常
db.test.find(); //正常,返回数据

show dbs;  //返回 assert:assert failed...
use admin
db.auth("root","abcd")//返回1
show dbs  //返回数据库列表

数据库的用户帐号是以文档的形式存储在system.users 集合里面。
文档的结构是 {"user":username,"read_only":true,"pwd": password hash}
可以删除
db.auth("test_user","efgh");//返回1
db.system.users.remove({"user":"test_user"})
db.auth("test_user","efgh"); //返回0

mongodb的分页
第一种
var page1 = db.my_collection.find().limit(10)  
var latest=null;while(p1.hasNext()){latest=p1.next()}
db.my_collection.find({"num":{"$gt":latest.num}}).limit(10)

第二种
db.my_collection.limit(10)//第一页
db.my_collection.skip(10).limit(10)//第二页
db.my_collection.skip(20).limit(10)//第三页


mongo索引学习笔记

db.imooc_collection.getIndexes() //查询索引
db.imooc_collection.ensureIndex({x:1}) //增加索引
db.imooc_collection.dropIndex({x:1}) //删除索引


mongodb索引种类
_id索引 绝大多数集合默认建立的索引

单键索引 最普通的索引 
db.imooc_collection.ensureIndex({x:1})

多键索引,与单键索引创建形式相同。区别在于字段的值
单键索引:值为一个单一的值,如字符串,数字或者日期
多键索引:值具有多个记录,例如数组 
db.imooc_collection.ensureIndex({x:[1,2,3,4,5]})

复合索引,当我们查询条件不只一条时,就需要建立复合索引
插入{x:1,y:2,z:3}
db.imooc_collection.ensureIndex({x:1,y:1})


过期索引 在一段时候后会过期的索引,索引过期,相应的数据会自动删除。这适合存储一些在一段时间
之后会失效的数据,比如用户的登录信息,存储的日志。
db.imooc_collection.ensureIndex({time:1},{expireAfterSeconds:10})
db.imooc_collection.ensureIndex({time:new Date()})
存储在过期索引字段的值必须是指定的时间类型
说明:1必须是ISODate或者ISODate数组,不能使用时间戳,否则不能自动删除
2.如果指定了ISODate数组,则按照最小的时间进行删除
3.过期索引不能是复合索引
4.删除时间不是精确。说明:删除过程是由后台程序每60s跑一次,而且删除也需要一些时间,所以存在很差。

全文索引 对字符串与字符串数组创建全文可搜索的索引
适用情况{author:"",title:":",article:""}
db.articles.ensureIndex({key:"text"})
db.articles.ensureIndex({key_1:"text",key_2:"text"})
db.articles.ensureIndex({"$**":"text"})

db.articles.find({$text:{$search:"coffee"}})
db.articles.find({$text:{$search:"aa bb cc"}})
db.articles.find({$text:{$search:"aa bb -cc"}}) //不包含cc的
db.articles.find({$text:{$search:"\"aa\"bb cc"}}) // 既包含aa又包含bb的、

全文索引相似度
$meta操作符:{score:{$meta:"textScore"}}
写在查询条件后面可以返回返回结果的相似度。与sort一起使用,可以达到很好的实用效果。
db.articles.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}).score({score:{$meta:"textScore"}})
限制:全文索引非常强大,但是同样存在限制。每次查询,只能指定一个$text查询。$text查询中不能使用$nor查询中
查询中如果包含了$text,hint不再起作用;不支持中文。

索引属性:
创建索引时的格式:
db.collection.ensureIndex({param},{param}) 其中第二个参数便是索引的属性
比较重要的属性:名字 唯一性 稀疏性 是否定时删除
db.imooc_collection.ensureIndex({x:1,y:1,z:1,m:1},{name:"normal_index"})
唯一性,unique指定
db.imooc_collection.ensureIndex({},{unique:true/false})
稀疏性,sparse指定:
db.imooc_collection.ensureIndex({},{sparse:true/false})
是否定时删除,expireAfterSeconds指定:
TTL,过期索引

地理位置索引
概念:将一些点的位置存储在mongodb中,创建索引后,可以按照位置来查找其他点。
查找方式:
1.查找距离某个点一定距离内的点 2.查找包含在某区域内的点。
子分类:2d索引,用于存储和查找平面上的点。
创建方式:db.imooc_collection.ensureIndex({"w":"2d"})
位置表示方式:经纬度【经度,纬度】 取值范围:经度【-180,180】 纬度【-90,90】
查询方式:1.$near查询:查询距离某个点最近的点。2.$geoWithin查询:查询某个形状内的点。
形状的表示:1.$box:矩形,使用 {$box:[[<x1>,<y1>],[<x2>,<y2>]]}表示
2。$center 圆形,使用{$center:[[<x1>,<y1>],r]}
3. $polygon 多边形 使用{$polygon:[[<x1>,<y1>],[<x2>,<y2>],[<x3>,<y3>]]}表示 
db.imooc_collection.find({w:{$near:[1,1]}})
db.imooc_collection.find({w:{$near:[1,1],$maxDistance:10,$minDistance:3}})

geoNear查询
geoNear使用runCommand命令进行使用,常用使用如下
db.runCommand({geoNear:<collection>,near:[x,y],minDistance:(对2d索引无效),maxDistance:,num:}})

2dsphere索引,用于存储和查找球面上的点。
概念:球面地理位置索引
创建方式:db.imooc_collection.ensureIndex({w:"2dsphere"})
位置表示方式:
GeoJSON:描述一个点,一条直线,多边形等形状
格式:{type:"",coordinates:[<coordinates>]}
查询方式与2d索引查询方式类似:
支持$minDistance与$maxDistance

索引构建情况分析
索引好处:加快索引相关的查询,不好处:增加磁盘空间消耗,降低写入性能。

如何评判当前索引构建情况
1.mongostat工具介绍,查看mongodb运行状态的程序
使用说明:mongostat -h127.0.0.1:27017
字段说明:索引情况:idx miss
2.profile集合介绍
db.getProfilingStatus() //profile默认是关闭的 db.ProfilingLevel()
db.setProfilingLevel(2) //开启
db.system.profile.find().sort({$natural:-1})//查询profile日志,字段意义:ts 时间戳 info 具体的操作 milis 操作所花时间,毫秒

3.日志介绍
4.explain分析

db.imooc_collection.find().explain()

mysql分区介绍以及案例展示
mysql分区介绍以及案例展示
分区类型
RANGE分区(portioning):根据列值所属的范围区间,将元组分配到各个分区。
LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
HASH分区:根据用户定义的函数的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。

1.创建分区表
CREATE TABLE part_tab
(c1 int default NULL,c2 varchar(30) default NULL,c3 date default NULL) engine=myisam
PARTITION BY RANGE (year(c3))(
PARTITION p0 VALUES LESS THAN (1995),
PARTITION p1 VALUES LESS THAN (1996) ,
PARTITION p2 VALUES LESS THAN (1997) ,
PARTITION p3 VALUES LESS THAN (1998) ,
PARTITION p4 VALUES LESS THAN (1999),
PARTITION p5 VALUES LESS THAN (2000) ,
PARTITION p6 VALUES LESS THAN (2001) ,
PARTITION p7 VALUES LESS THAN (2002) ,
PARTITION p8 VALUES LESS THAN (2003) ,
PARTITION p9 VALUES LESS THAN (2004) ,
PARTITION p10 VALUES LESS THAN (2010),
PARTITION p11 VALUES LESS THAN MAXVALUE
);

2.创建一个不分区的表
create table no_part_tab(c1 int(11) default NULL,c2 varchar(30) default NULL,c3 date default NULL)engine=myisam;

3.创建一个生成8000000行数据的存储过程:
delimiter //
CREATE PROCEDURE load_part_tab()
begin
declare v int default 0;
while v < 8000000
do
insert into part_tab(c1,c2,c3)
values (v,'testing partitions',adddate('1995-01-01',(rand(v)*36520) mod 3652));
set v = v + 1;
end while;
end
//

4.调用存储过程,生成数据:
delimiter ;
call load_part_tab();

5.把数据同步到no_part_tab表中
insert into no_part_tab select * from part_tab;


6.开始测试
explain select count(*) from no_part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31';
explain select count(*) from part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31';

windows下装php的mongodb扩展

windows下装php的mongodb扩展,遇到一个问题 ,折腾了半天

问题:phpinfo中看不到mongo的信息,扩展都已经配置进去,apache重启也没有报错

我的电脑环境是装的wampserver,php版本是5.5.12,X64,我先下载mongodb的安装包mongodb-win32-x86_64-2008plus-ssl-3.0.3-signed.msi(官网可下载到),如日志http://xingdong365.com/network/32.html 已经正常了。

下面需要装扩展文件,找的是对应的版本 php_mongo-1.6.8-5.5-vc11-x86_64.dll (地址:http://windows.php.net/downloads/pecl/releases/mongo/1.6.8/)。复制到php的ext目录下,又更改php.ini,wampserver环境也已经在扩展php_mongo 打上了对钩。感觉没啥问题。可就是在访问phpinfo.php的时候没有mongo的信息。

折腾的半天,最后找了一个php_mongo-1.4.5-5.5-vc11-x86_64.dll(地址:http://download.csdn.net/download/dupingjin/7577217),终于解决了。看来还是版本问题。


mysql慢查询日志以及日志分析工具
show variables like "slow_query_log"; //确认是否开启慢查询
show variables like "%log%"; //查看更多日志信息

set global slow_query_log = on; //开启
show variables like "%slow%";//查看慢查询的信息,如下,可以单独设置更改
set global_slow_query_log_file = '/home/mysql/sql_log/mysql-slow.log';
set global log_queries_not_using_indexes = on;
set global long_query_time = 1;

慢查询日志分析工具
一、mysqldumpslow
实例
mysqldumpslow -t 3 /home/mysql/sql_log/mysql-slow.log | more

二、pt-query-digest
实例
1、pt-query-digest slow-log > slow.log.report
2、pr-query-digest slow-log -review \
h=127.0.0.1,D=test,p=root,P=3306,u=root,t=query_review \
--create-reviewtable \
--review-history t= hostname_slow



把text文件内容导入mysql数据库
1.先针对文件创建一个数据表,如action,字段id,title,url
2.从text文件内容导入数据到mysql
load data local infile “c:/data.txt” into table action(title,url);
3.把mysql里面的数据导入到text文件
select title,url into outfile “c:/data_out.txt”  lines terminated by “/r/n” from action;     

MySQL 去除字段中的换行和回车符 /r/n
update action set url=replace(replace(url, char(10),''), char(13),'');
mysql数据库root密码丢失

Service  mysqld stop

Mysql_safe --skip-grant-tables --user=mysql&   //跳过授权表mysql.user和mysql.db这些表

Mysql -uroot

Update user set password = password(‘1314’) where user = ‘root’ and host=’localhost’;


 flush privileges;­


优惠券
最新微语