4月 10

linux下测试python连接mysql

[整理人 :张子萌 2011-4-10]
测试环境:
centos,Python 2.6.5,setuptools-0.6c11,MySQL-python-1.2.2,mysql 5.1.44
首先需要安装zlib、zlib-devl、python和python-devl。
yum install zlib zlib-devl

安装使用包,如果已有可以不用安装
wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz
获得连接连接mysql的包
wget http://downloads.sourceforge.net/project/mysql-python/mysql-python/1.2.2/MySQL-python-1.2.2.tar.gz
可以选择高版本1.2.3就不会遇到错误1和错误2
wget http://downloads.sourceforge.net/project/mysql-python/mysql-python/1.2.3/MySQL-python-1.2.3.tar.gz

具体操作命令:
# tar zxvf setuptools-0.6c11.tar.gz
# cd setuptools-0.6c11
# python setup.py build
# python setup.py install

# tar zxvf MySQL-python-1.2.2.tar.gz
# cd MySQL-python-1.2.2
# python setup.py build
# python setup.py install

测试脚本
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import os,sys
import MySQLdb
try:
db = MySQLdb.connect(host = ‘localhost’, user=’root’ passwd = ‘xxxxx’, db = ‘mysql’)
except MySQLdb.ERROR,e:
print “Error %d:%s”%(e.args[0],e.args[1])
exit(1)
cursor = db.cursor()
cursor.execute( ‘select * from user’)
result_set=cursor.fetchall()
print result_set
cursor.close()
db.close()
如果能查到结果,恭喜正确了。

错误1.
>>> import MySQLdb
Traceback (most recent call last):
File ““, line 1, in
File “build/bdist.linux-i686/egg/MySQLdb/__init__.py”, line 19, in
File “build/bdist.linux-i686/egg/_mysql.py”, line 7, in
File “build/bdist.linux-i686/egg/_mysql.py”, line 6, in __bootstrap__
ImportError: libmysqlclient_r.so.16: cannot open shared object file: No such file or directory

解决方法
首先查找模块
# find / -name libmysqlclient_r.so.16
/usr/local/src/mysql-5.1.44-linux-i686-glibc23/lib/libmysqlclient_r.so.16
/usr/local/mysql/lib/libmysqlclient_r.so.16
将模块路径加入动态链接库设置为共享
vim /etc/ld.so.conf
加入:libmysqlclient_r.so.16所在目录
ldconfig -v

错误2.
>>> import MySQLdb
/usr/local/lib/python2.6/site-packages/MySQL_python-1.2.2-py2.6-linux-i686.egg/MySQLdb/__init__.py:34: DeprecationWarning: the sets module is deprecated

解决方法
进入./MySQL-python-1.2.2/MySQLdb目录中
1) 在文件 “__init__” 中将:
from sets import ImmutableSet
class DBAPISet(ImmutableSet):
替换为
class DBAPISet(frozenset)
3) 在文件 “converters.py”, 把 “Set” 改为 “set”
将return set([ i for i in s.split(‘,’) if i ])中”Set” 改为 “set”
将set: Set2Str,中”Set” 改为 “set”
2) 在文件 “converters.py”中移除:
from sets import BaseSet, Set
修改完毕后在做编译和安装。

错误3.
_mysql.c:36:23: 错误:my_config.h:没有那个文件或目录

解决方法
设置include 头文件路径即可,如下
export C_INCLUDE_PATH=/usr/local/mysql/include/

错误4.
>>> cur.execute(‘select * from user’)
Segmentation fault

解决方法
将语句写为“select user,host from user”可以正常查出。
在64位的服务器上安装发现此问题。不知道为什么会有段错误。是否所有64位服务
器均有此问题,我没有测试

3月 25

导出mysql 上传到ftp备份

导出mysql的库上传到ftp服务器备份,上传完毕删除本地文件。用crontab定时运行。用shell也很容以实现,毕竟在学习python,练习一下。

#!/usr/bin/env python
#-*- coding: utf-8 -*-
# ——————————————————————————-
# Filename: Back mysql
# Revision: 1.0
# Date: 2010-03-24
# Author: simon-zzm
# Email: simon-zzm@163.com
# Description:
# ——————————————————————————-
import os,time,sys
from ftplib import FTP
import datetime

###################设置参数
mysql_user=’root’
mysql_pass=’123456′
mysql_comm=’/usr/local/mysql/bin/mysqldump’
mysql_data=[‘test_a’,’test_b’] ###可以填写多个库
mysql_local_path=’/usr/local/checksystem/’
ftp_ip=’x.x.x.x’
ftp_user=’ftpuser’
ftp_pass=’test’
admin_mail=’simon-zzm@163.com’
###################开始运行
#导出的文件为gz的压缩文件,命名格式为ip地址、库名、导出日期组成。
###获得当前时间
get_time_now=time.strftime(‘%Y-%m-%d’)
###获得本机IP地址
ip = os.popen(“/sbin/ifconfig | grep ‘inet addr’ | awk ‘{print $2}'”).read()
get_local_ip = ip[ip.find(‘:’)+1:ip.find(‘n’)]
for i in mysql_data:
###拼成包名
mysql_back_name=mysql_local_path+get_local_ip+’_’+i+’_’+get_time_now+’.gz’
###拼成导出命令
gzip_command = “%s -u%s -p%s –opt %s |gzip >%s” %(mysql_comm,mysql_user,mysql_pass,i,mysql_back_name)
###导出并判断是否成功
if os.system(gzip_command)==0:
print ‘Back Successful’
###导出成功上传到ftp服务器
ftp=FTP()
ftp.set_debuglevel(2)
ftp.connect(ftp_ip,’21’)
ftp.login(ftp_user,ftp_pass)
file_handler = open(mysql_back_name,’rb’)
bufsize = 1024
ftp.storbinary(‘STOR %s’ % os.path.basename(mysql_back_name),file_handler,bufsize)
ftp.set_debuglevel(0)
file_handler.close()
ftp.quit()
print ‘up load over!’
###偷个懒使用linux命令将本地文件删掉。
os.popen(“/usr/bin/find “+mysql_local_path+”* -name *.gz -exec rm -rf {} ; “)
else:
print ‘false’
###如果导出失败,给管理员发个信,偷个懒使用linux命令解决。
mail_url=”/bin/mail -s “+get_local_ip+”back fail “+admin_mail+” os.popen(mail_url)

3月 23

strace记录

ltrace用于跟踪库调用的情况,strace用于系统调用的情况,strace是ltrace的一个功能子集。
对于优化和处理问题有很大帮助。

命令格式
strace [ mid sid level ] …
mid 指定 STREAMS 模块的标识号。
sid 指定子标识号。
level 指定跟踪优先级别。

主要参数
-c — 统计对系统时间、呼叫、错误的次数
-f — 跟踪fork产生的子进程
-ff — 输出报告文件
-F — 尝试跟踪vforks
-i — 输出系统调用的入口指针.
-q — 禁止输出脱离的信息
-r — 打印每个系统调用的相对时间
-t — 在输出中的每一行前加上时间信息
-tt — 在输出中的每一行前加上时间信息,微秒级.
-T — 显示每一调用所耗的时间.
-v — 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.
-a column — column 设置返回值的输出位置.默认 为40.
-e expr 指定一个表达式,用来控制如何跟踪
-e trace=set 只跟踪指定的系统调用.例如:-e trace=open,close,rean,write表示只跟踪
这四个系统调用.默认的为set=all.
-e trace=file 只跟踪有关文件操作的系统调用.
-e trace=process 只跟踪有关进程控制的系统调用.
-e trace=network 跟踪与网络有关的所有系统调用.
-e strace=signal 跟踪所有与系统信号有关的系统调用.
-e trace=ipc 跟踪所有与进程通讯有关的系统调用.
-e abbrev=set 设定strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
-e raw=set 将指定的系统调用的参数以十六进制显示.
-e signal=set 指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.
-e read=set 输出从指定文件中读出的数据.例如-e read=3,5
-e write=set 输出写入到指定文件中的数据.
-o file — 将strace的输出写入文件
-O overhead — set overhead for tracing syscalls to OVERHEAD usecs
-p pid — pid进程
-s strsize — 指定输出的字符串的最大长度.默认为32.文件名一直全部输出.
-S sortby — 按照时间,呼叫、名字进行排序,默认使用时间(time, calls, name)
-u username — 运行所使用的用户id

输出格式

应用:
学习中还没有用过。

参考资料:
http://study.chyangwa.com/IT/AIX/aixcmds5/strace.htm#a136c1238
http://www.yuanma.org/data/2007/0201/article_2213.htm

3月 18

Linux系统下shell用telnet通过smtp发邮件

之前shell中都是使用mail命令发邮件,但是出现一个问题,服务器在内网,必须使用smtp
服务。实现发邮件有两种方法。一、修改sendmail的配置,然后还是用mail命令,二、使用telnet
方式来发邮件。我将第二种方法记录下来。
我的smtp不需要认证服务,调用函数需要传入的参数依次为:发送人的邮件地址、收件人的
邮件地址、邮件主题、邮件内容、smtp的IP地址、smtp的端口

send_mail()
{
    (for i in "ehlo localhost.localdomain" "mail FROM:<${1}>" "rcpt TO:<${2}>" "data";
     do 
         sleep 1
         echo ${i}
         sleep 2
     done 
     echo "from:<${1}>"
     echo "subject:${3}"
     echo "to:<${2}>"
      echo ""
     echo "${4}"
     echo "."
     sleep 2 
     echo "QUIT")|telnet ${5} ${6}
}

#调用并传入参数
send_mail “simon-zzm@163.com” “test@test.com” “test” “ok!” “192.168.11.1” “25”

3月 16

linux 系统数据恢复

[整理人:张子萌 2011-03-14]

linux管理员不小心rm了数据,会很郁闷,所以需要数据恢复。我记录个人的恢复实验结果。如果可以把硬盘拿下里挂载windows上可以试试Raise Data Recovery for Ext2/Ext3/Ext4、r-linux工具,其它工具也很多,但是收费的居多。用windows恢复后容易造成使用权限错误等问题,所以不能直接恢复到linux盘上使用。据说winpe里也可以用,但是我没有做实验,毕竟用winpe在服务器上也挺怪的。主要实验一下在linux上实际操作。TestDisk、PhotoRec、ext3grep。TestDisk主要用来恢复损坏的分区以及拯救无法引导的磁盘。PhotoRec 主要用于恢复损坏的数据文件和文档等。Ext3grep恢复大部分数据文件。

PhotoRec 下载地址

http://www.cgsecurity.org/wiki/PhotoRec

ext3grep下载地址

http://ext3grep.googlecode.com/files/ext3grep-0.10.2.tar.gz

软件主站

http://www.xs4all.nl/~carlo17/howto/undelete_ext3.html

先看ext3grep效果,我的分区如下

linux 系统数据恢复 - simon-zzm - simon个人观点

在program下随便放了一个文档pdf。并且见了3个目录abc,在a目录下放了一个txt文件。

# rm -rf 2011.pdf a/

把a目录和2011.pdf删除,删除完毕卸载/program分区,准备测试恢复。

首先安装或升级一下e2fsprogs、e2fslibs库,在CentOS中安装e2fsprogs库。如果是Ubuntu需要安装两个库,命令sudo apt-get install e2fsprogs e2fslibs-dev。我的实验环境是Centos。(任何恢复都需要安装此库)

#yum install –y e2fsprogs

# wget http://ext3grep.googlecode.com/files/ext3grep-0.10.2.tar.gz

# tar zxvf ext3grep-0.10.2.tar.gz

# cd ext3grep-0.10.2

# ./configure

# make && make install

ext3grep主要参数:

–print 打印块、inode和所有信息

–ls 打印目录、过滤信息

–inode 从某个indoechazhao

–block 从某个块查找

–group 只找某个组

–after 找在某点时间后删除的数据

–before 找在某点时间前删除的数据

–restore-file 恢复文件到某个目录

–restore-all 恢复所有删除,删除的数据会在当前的RESTORED_FILES目录中

开始从第二个inode扫描删除的文件

# ext3grep /dev/sda4 –ls –inode 2

扫描完成如下图

linux 系统数据恢复 - simon-zzm - simon个人观点

在第四列为inode值,第五列中写有D的就是被删除的文件。

使用一下命令我看看a目录下有什么东西,a目录的inode值为75777

# # ext3grep /dev/sda4 –ls –deteled –inode 75777

linux 系统数据恢复 - simon-zzm - simon个人观点

# ext3grep /dev/sda4 –restore-file a/123.txt

linux 系统数据恢复 - simon-zzm - simon个人观点

看到Restoring 已经恢复成功,查看123.txt文件文件内容没有问题,但是pdf的没有成功,不知道为什么。又测试删除mysql数据库的数据,经过恢复的数据也可以使用。总体说效果挺好。

然后试试PhotoRec,官方说明能恢复格式如下:

– RIFF audio/video (.avi/.wav)

– BMP bitmap (.bmp)

– bzip2 compressed data (.bz2)

– Source code written in C (.c)

– Canon Raw picture (.crw)

– Canon catalog (.ctg)

– FAT subdirectory

– Microsoft Office Document (.doc)

– Nikon dsc (.dsc)

– HTML page (.html)

– JPEG picture (.jpg)

– MOV video (.mov)

– MP3 audio (MPEG ADTS, layer III, v1) (.mp3)

– Moving Picture Experts Group video (.mpg)

– Minolta Raw picture (.mrw)

– Olympus Raw Format picture (.orf)

– Portable Document Format (.pdf)

– Perl script (.pl)

– Portable Network Graphics (.png)

– Raw Fujifilm picture (.raf)

– Contax picture (.raw)

– Rollei picture (.rdc)

– Rich Text Format (.rtf)

– Shell script (.sh)

– Tar archive (.tar )

– Tag Image File Format (.tiff)

– Microsoft ASF (.wma)

– Sigma/Foveon X3 raw picture (.x3f)

– zip archive (.zip)

支持的磁盘格式如下:

– DOS/Windows FAT12, FAT16 and FAT32

– NTFS ( Windows NT/2K/XP )

– Linux Ext2 and Ext3

– BeFS ( BeOS )

– BSD disklabel ( FreeBSD/OpenBSD/NetBSD )

– CramFS (Compressed File System)

– HFS and HFS+, Hierarchical File System

– JFS, IBM’s Journaled File System

– Linux Raid

– Linux Swap (versions 1 and 2)

– LVM and LVM2, Linux Logical Volume Manager

– Netware NSS

– ReiserFS 3.5, 3.6 and 4

– Sun Solaris i386 disklabel

– UFS and UFS2 (Sun/BSD/…)

– XFS, SGI’s Journaled File System

试试看

# wget http://www.cgsecurity.org/testdisk-6.11.3.linux26.tar.bz2

# bunzip2 testdisk-6.11.3.linux26.tar.bz2

# tar xvf testdisk-6.11.3.linux26.tar

# cd /root/testdisk-6.11.3/linux

# ./testdisk_static

linux 系统数据恢复 - simon-zzm - simon个人观点

英文提示很简。测试了一下图片格式恢复没有问题,其它格式没有试,但是名称都变成索引名了,有点不方便。

还存在一个问题就是ext4格式。ext4在rehdat5中已经支持,但是需要安装e4fsprogs,在redhat6中已经是默认安装,所以将来使用ext4的几率也很大。Ext3grep工具在ext4下已经无能为力,所以需要其它工具的支持。上网上找找是否会有ext4grep,发现了http://tjworld.net/wiki/Linux/Ext4Undelete,没有搞清楚。

介绍较多的是extundelete。

extundelete的下载地址

http://extundelete.sourceforge.net/

linux 系统数据恢复 - simon-zzm - simon个人观点

首先安装e2fsprogs和e2fslibs,然后编译

# cd extundelete-0.2.0

# ./configure

# make

不安装了直接用

#cd src

# /extundelete /dev/sda9 –restore-all

应该是我系统内核版本太低,虽然支持ext4,但软件恢复却没有成功。内核2.6.28以上的应该没有问题。Fedora上有人测试过没有问题,redhat和centos就应该没有问题。

试试PhotoRec是否可以恢复ext4的盘。步骤抓图如下:

启动

linux 系统数据恢复 - simon-zzm - simon个人观点

选择磁盘

linux 系统数据恢复 - simon-zzm - simon个人观点

选择好分区类型

linux 系统数据恢复 - simon-zzm - simon个人观点

选择要恢复的盘

linux 系统数据恢复 - simon-zzm - simon个人观点

不知道为什么支持了,和介绍里说的不一样,选第一项

linux 系统数据恢复 - simon-zzm - simon个人观点

选第一项

linux 系统数据恢复 - simon-zzm - simon个人观点

选择恢复后的路径,直接点y,保存到当前目录的recup_dir.1目录中

linux 系统数据恢复 - simon-zzm - simon个人观点
进入recup_dir.1目录查看jpg文件恢复了,并且可以使用,但是名称有变化了。pdf的好像没有成功。
linux 系统数据恢复 - simon-zzm - simon个人观点

照目前看txt等文本类和图片类的恢复也没有问题,但是只能靠grep在去找那个是需要的文件了。

经验总结:

使用rm需要格外小心(会出人命的)。在不小心删除后,最好及时卸载分区,避免数据覆盖写入。如果必须挂载,可以使用只读模式。