分类归档: DBA

数据库管理 数据库设计

怎么打开/查看MySQL的SQL记录?

我们在开发的时候经常经常遇到在程序中增加调试语句很麻烦的情况,这时候难免会想如果Mysql能看到我们执行了什么SQL语句就好了。

实际上MySQL是有这个功能的,在MySQL 5.1的时候我们就可以通过mysqld的-l参数来启动mysql来记录查询日志。

但是现在-l参数自5.1.12之后已经不推荐使用了,改为–general_log

As of MySQL 5.1.12, as an alternative to –log or -l, use –general_log[={0|1}] to specify the initial general query log state. In this case, the default general query log file name is used. With no argument or an argument of 1, –general_log enables the log. With an argument of 0, this option disables the log.

 

–general_log 打开后日志默认会输出到你的data目录下,默认文件名是 hostname.log。hostname是你的机器名,在windows上貌似是localhost或者其他什么奇怪的名字吧。

 

如果服务器已经启动或者不是直接用mysqld启动服务器的怎么办呢?(运行时开关General Log)

执行下面两个SQL就可以开关日志

打开日志

SET GLOBAL general_log = 'ON';

关闭日志

SET GLOBAL general_log = 'OFF';

 

配置文件可以设置General Log的开关吗?

在配置文件中[mysqld]段增加下面一行

general_log = 1

如果需要指定日志文件路径

general_log_file = 文件路径

Read: 6915

合并多个Redis dump.rdb 到一个rdb的多个database

公司的服务器上运行了多个redis,现在希望合并到一个redis,用上redis的多database特性。

在网上找了一圈发现没有比较好的工具可以进行这个处理。

看过一个redis-dump号称可以导出json再进行导入,结果alpha版本的程序真心不靠谱,运行后报错:

undefined method `select!` for ["x"]:Array

后来没办法只好自己研究起了RDB。其实RDB也很简单,在redis的官方网站上有完整说明

https://github.com/sripathikrishnan/redis-rdb-tools/wiki/Redis-RDB-Dump-File-Format

 

通过文档了解到像我正在用的这种单db的rdb,其数据结构很简单,前9个字节都是REDIS的MAGIC STRING和RDB版本号,其后跟着两个字节 FE 00 表示0号db,同理如果是1号db应该是 FE 01,再之后就是这个db内所有数据,在文件最后以一个字节FF表示文件结束。

由此得出要合并3个db只需要把每个文件去掉开头9个字节和最后一个字节,然后把对应的db index改为需要合并到的db index,最后合并到一个文件,并在开头加上之前去掉的9个字节,再在末尾加上一个FF即可完成合并。

合并完成后别忘了用 redis-check-dump检查一下

 

linux下可以用bvi进行二进制编辑,用法与vi基本一致。另外在编辑前可能需要执行一下 :set memmove 命令。

如果不想安装bvi,只用dd命令也是可以做到的,只是处理大文件的时候可能会比较慢(因为block size=1byte了,我不知道怎么在bs设的较大的情况下精确控制skip和count)。

 

dd bs=1 if=dump.rdb of=out.rdb skip=9 count={你的dump.rdb的文件大小-10,单位字节}

 

这样执行后生成的out.rdb只包含从FEXX开始的数据信息。如果要合并到一个库,可以去掉第一个文件的EOF标识,去掉第二个文件的前9个字节。再cat到一个文件即可。

 

注意:导出前记得用redis-cli save并关闭服务以保证数据一致

Read: 623

[转]安全警示,一个简单的MongoDB注入

原文地址:http://blog.nosqlfan.com/html/2336.html

 

在关系型数据库时代,SQL注入攻防几乎成了每一个Web开发者的必修课,很多NoSQL的支持者称NoSQL的同时也就No SQL注入了。其实不然,下面就是一个利用GET参数判断不严格进行的MongoDB注入,希望能够引起大家大家在安全方面的重视。

使用SQL数据库存储用户名密码的系统,我们检测用户名与密码的过程可能是这样的:

mysql_query("SELECT * FROM user
    WHERE username=" . $_GET['username'] . ",
    AND passwd=" . $_GET['passwd'])

我们使用MongoDB进行最简单的用户名与密码检测可能是这样的:

$collection->find(array(
    "username" => $_GET['username'],
    "passwd" => $_GET['passwd']
));

在最普通的SQL注入中,我们可以构造下面这样的请求:

login.php?username=admin&passwd=abc OR 1 –

这个请求会形成这样的SQL语句:

SELECT * FROM user WHERE username=admin AND passwd=abc OR 1;

成功注入!

采用同理的方法,针对上面的MongoDB查询方式,你可以构造下面的请求:

login.php?username=admin&passwd[$ne]=1

这个请求会形成这样的MongoDB查询:

$collection->find(array(
    "username" => "admin",
    "passwd" => array("$ne" => 1)
));

成功注入!

更多NoSQL安全相关的知识可以查看NoSQLFan的另一篇文章:《NoSQL安全攻防战

相关链接:www.idontplaydarts.com

Read: 1199

SQL SERVER MultipleActiveResultSets

最近要写个从SQLSERVER导出数据的程序。 我很少用SQLSERVER,不熟悉,结果写的时候碰上个诡异的问题。

SQLSTATE[IMSSP]: The connection cannot process this operation because there is a statement with pending results.  To make the connection available for other queries, either fetch all results or cancel or free the statement.  For more information, see the product documentation about the MultipleActiveResultSets connection option.

 

用了那么久MYSQL和ORACLE,我还真不知道多结果集支持还需要手动开启。。。好吧,查了一下MS的文档,把参数给加上了。。。你妹啊!! 还是不行,问题依旧。赶紧搜索引擎,结果居然得到一个2B的提示。。。MultipleActiveResultSets   is   only   supported   by   SQL   Server   2005。。。

我了个去。。。这玩意SQLSERVER2000居然不支持。。。他妹的。。。你说我这要是几十万万条记录的往外取不得玩死我啊?

Read: 1299