标签 MySQL 下的文章

mysql挂马存储过程

50刀的业务写了一个mysql批量在指定数据库让所有指定类型的数据附加上指定字符串。当然最广泛的应用就是非常不河蟹的数据库挂马了。

以前写过sqlserver挂马,如果有兴趣可以去看看。此文是mysql的,不要搞错了哦。

代码在此:

DELIMITER $$
USE `wp`$$
DROP PROCEDURE IF EXISTS `guama`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `guama`()
BEGIN
    DECLARE _tbl VARCHAR(100);
    DECLARE _cl VARCHAR(100);
    DECLARE notFound INT DEFAULT 0;
    DECLARE cur CURSOR FOR SELECT table_name,column_name FROM information_schema.columns
    /* table_schema:指定挂马数据库 , data_type:指定挂马数据类型 */
    WHERE table_schema = 'wp' AND (/*data_type ='text' or */data_type='longtext');
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET notFound =1;
    OPEN cur;
        WHILE notFound = 0 DO
            FETCH cur INTO _tbl,_cl;
            /* 挂马 */
            #SET @s = CONCAT('update ',_tbl,' set ',_cl,' = concat(',_cl,',\'whatthefuck is tunps.com \')');
            /* 清除挂马 */
            SET @s = CONCAT('update ',_tbl,' set ',_cl,' = replace(',_cl,',\'whatthefuck is tunps.com \','''')');
                PREPARE stmt FROM @s;
                EXECUTE stmt;           
        IF NOT notFound THEN SET notFound = 0;
        END IF;
    END WHILE;
CLOSE cur;
END$$

DELIMITER ;

以上以wordpress为例子,实用concat来挂马,如果想清除使用replace。

中秋节三日都是搞这个,碰到了一个难题,再一次在stackoverflow上面得以解答。实用prepare语句实现了mysql的动态sql。

mysql将一张表的查询结果存到另一张表中

网上说mysql不支持select into 找了两个方法 answer 01: create table dust select * from student;//用于复制前未创建新表dust的情况下 answer 02: insert into dust select * from student;//已经创建了新表dust的情况下 /来源 实际应用中:

INSERT INTO destTable( A )
SELECT a
FROM (
SELECT A AS a, COUNT( A ) AS c
FROM srcTable
WHERE C LIKE '%在线%'
GROUP BY a
ORDER BY c DESC
)t
WHERE t.c =3

写的过程中出现了两个问题,
  1. insert into 后面多写了一个table,结果老是syntax error
  2. subquery内部查询必须使用alias(上文中的t),不然也报syntax error
  3. 如果要存入文件使用into outfile '/tmp/xxfile.sql'

用cpanel的cron jobs来备份mysql数据库和网站文件

进网站的cpanel,advanced菜单里面的Cron Jobs,

"Add New Cron Job",时间看情况自己定,然后Command填写

mysqldump -utunpscom_user -ptunpscom_pass --opt tunpscom_db | bzip2 -c > /home/tunpscom/tunpscom_`/bin/date +"\%Y\%m\%d_\%H\%M\%S"`.sql.bz2

以上是备份数据库了,注意date %的格式,前面加入了反斜杆,如果不加反斜杆,会报错:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

至今未搞懂是嘛原因。

备份网站:

tar cjvf wp_content_`/bin/date +"\%Y\%m\%d_\%H\%M\%S"`.tar.bz2 ~/public_html/wp-content/

注意时间不要备份得太勤了,否则主机就警告你了:

The account with the username 'tunpscom' (tunps.com), is running out of disk space.

Please remove some files from this account, or ask the administrator to increase your disk quota.

This account has used 101.22% (607.30 Megs) of its allocated disk space.

!! Do not respond to this message. Your reply will go nowhere. !!

bzip2也表示鸭梨很大:

bzip2: I/O or other error, bailing out. Possible reason follows.
bzip2: Disk quota exceeded
Input file = (stdin), output file = (stdout)
mysqldump: Got errno 32 on write

看32错误是嘛玩意儿:

[root@db1 cron.daily]# perror 32
OS error code  32:  Broken pipe

crontab定时备份mysql

rhel5的默认的/etc/crontab文件内容:

[root@localhost ~]# more /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

run-parts是一个bash脚本,可以运行指定目录的shell,将以下内容保存为*.sh,并保存在/etc/cron.daily目录:
前面的内容分为5个部分,分别是:分 时 日 月 周 , root表示以root用户权限运行
那么/etc/cron.daily下脚本将会在每天临晨4点2分的时候运行

mysqldump --opt tunpscom | bzip2 -c > /data/`date +%Y%m%d_%H%M%S`.bz2

反引号里面的内容是执行date命令,后面%指定日期格式,具体请man date。还有一点需要注意的是bzip2压缩出来的体积比gz小,但是压缩时间长,几百MB看不出来,如果上了G就很明显了。所以也可以用gzip压缩代替:

mysqldump --opt tunpscom | gzip -c > /data/`date +%Y%m%d_%H%M%S`.gz

然后需要将这个*.sh文件的权限修改:chmod 755,让大家都有rx权限。

生成的文件的大概是:20110426_030103.bz2。

ps:10G大小的文本文件用gzip压缩后大小在300MB左右,用bzip2压缩后大小在100MB左右。除了以上介绍的方法,可以使用
crontab -e 新建一个计划任务。
crontab -r 删除计划任务。
crontab -l 列出计划任务。

正则表达式 mysql字段转oracle一例

某mysql字段如下:
`test_id` int(11) not null auto_increment comment '自增字段',
而且有大量的这样字段需要转到oracle,首先我们知道oracle的字段描述里面是没有comment的,但是同时也需要保留comment信息。使用正则表达式来转换,用notepad++正则表达式替换:
查找目标:

comment(.*),

替换为:

,comment\1

\1表示的是(.*)的内容
最后替换为:
`staff_id` int(11) not null auto_increment ,-- '自增字段'
然后去掉反引号,去掉auto_increment,手动加上constraint primary key。