一个备份mysql的脚本,很简单

作者 : admin 于 2009年07月29日, 21:43:46
2009
07-29

帮朋友维护服务器的时候,习惯性得检查各项服务和维护,偶然间发现了这个脚本,冒着被BS的风险分享给大家,希望大家捧个钱场,施舍给老衲几万块钱买套房。

  1. @echo off
  2. C:
  3. CD "C:\Program Files\WinRAR"
  4.  
  5. net stop Mysql
  6. winrar.exe a -ag"-[YYYY-MM-DD-HH-MM-SS]" -k -r -s -ibck -inul "D:\MYSQL备份生成的文件.rar" "E:\bak\data\*.*"
  7. net start Mysql

Python写的数据抽象层

作者 : admin 于 2009年03月30日, 11:26:09
2009
03-30

python本身没有对mysql的支持,得依赖附加的库 http://mysql-python.sourceforge.net 。很多框架采用了这个库,比如adodb,django等。不过我倾向于自己写这些东西,所以小研究了一下。 mysql-python 有两个对象 MySQLdb _mysql 这里是介绍http://mysql-python.sourceforge.net/MySQLdb.html,我使用的是 MySQLdb 对象

  1. #!/D:\python25\python.exe
  2. import MySQLdb
  3.  
  4. class Mysql(object):
  5.     handle = ''
  6.     query = ''
  7.     exectime = 0
  8.     effected = 0
  9.  
  10.     def __init__( self , hostname , username , password , database ):
  11.         db = MySQLdb.connect( host = hostname , user = username , passwd = password , db = database )
  12.         self.handle = db.cursor()
  13.         
  14.     def query( self , sql = '' ):
  15.         return self.handle.execute( sql )
  16.  
  17.     def fetch( self , sql = '' ):
  18.         self.handle.execute( sql )
  19.         rs = self.handle.fetchone()
  20.         count = 0
  21.         result = {}
  22.         for colnum in self.handle.description:
  23.             result[colnum[0]] = rs[count]
  24.             count += 1
  25.         return result
  26.     
  27.     def fetchAll( self , sql = '' ):
  28.         self.handle.execute( sql )
  29.         result = {}
  30.         bigcount = 0
  31.         for recordline in self.handle.fetchall():
  32.             littlecount = 0
  33.             result[bigcount] = {}
  34.             for colnum in self.handle.description:
  35.                 result[bigcount][colnum[0]] = recordline[littlecount]
  36.                 littlecount += 1
  37.             bigcount += 1
  38.         return result
  39.  
  40.     def insertID( self ):
  41.           self.handle.execute("SELECT LAST_INSERT_ID() AS lid")
  42.           rs = self.handle.fetchone()
  43.           return rs[0]
  44.  
  45.     def close( self ):
  46.           self.handle.close()
  47.           pass
  48. #DEMO
  49. db = Mysql('localhost','root','123456','frame')
  50. db.fetchAll('select * from user')
  51. #rs = db.fetchAll('select * from user')
  52. #sql = "INSERT INTO tags (module,fid,name,note,`order`) VALUE ('test',1,'fd','ds',1)"
  53. #db.query(sql)
  54. #print db.insertID()

mysql索引优化

作者 : admin 于 2009年02月15日, 14:01:09
2009
02-15

做复杂的数据报表经常要很多sql语句连续执行,不是超时就是把mysql跑挂。不过现在硬件廉价,这些软件完美得兼容了多核多线程,虽然一个mysql进程负载高,但只占用一个内核,其他的查询依然可以使用其他的内核进行运算,服务器不会整体挂掉。

mysql优化,主要是索引,大量消耗资源的查询一定要做相关索引优化,具体优化思想我是阅读的这本书-http://www.douban.com/subject/3039216/ 里边mysql优化部分讲得非常简洁明了。而对于cpu的优化,就是尽力把整体时间拉开,cpu会比较平稳。具体做法是用sleep把sql语句分隔,这样用时间换取了稳定。当然,有些报表数据一旦作出就不会再变,这时最好把这些数据文本缓存,以后查询只读取文本即可。

sunboyu-amp-fastcgi-suexec-v21-alpha 发布

作者 : admin 于 2008年12月15日, 21:58:14
2008
12-15

Linux下APACHE MYSQL PHP FCgid Suexec 自动安装脚本V2.1
1、增加了PHP –enable-bcmath 参数,支持高精度函数库
2、增加了ncurses MYSQL的一个依赖库
3、增加了apache –enable-so 参数

sunboyu-amp-fastcgi-suexec-v21-alpha

此脚本在Centos4.7ServerCD 最小安装,root账户下执行完全正常。

Windows下安装Apache,Mysql,PHP过程详解

作者 : admin 于 2008年12月04日, 09:40:14
2008
12-4

原则:使用官方程序,完全自己配置,不使用其他辅助工具套件等。

准备:

apache2.2.*   http://httpd.apache.org/download.cgi   如果有stable版本,最好用stable版,其实最新版作为调试也不错

PHP5.2.*  http://www.php.net/downloads.php  目前是5.2.6

mysql5.1  http://dev.mysql.com/downloads/mysql/5.1.html  下载windows安装版本

1、安装Apache,安装路径随意,默认即可,手工管理更好,建议放到 d:\Apache 放D盘是为了以后重装的话,所有的配置文件都还在(备份不仅要备份数据,还要备份不起眼的配置文件)

2、安装Mysql,同上,安装到 D:\Mysql  理由同上

3、解压PHP5.2.×至目录 D:\PHP5 理由还是同上

4、配置环境变量:在桌面上找到“我的电脑”,右键点击“我的电脑”,选择“属性”里的“高级”标签,点击“环境变量”,在“系统变量”里找到“Path”,点击“编辑”按钮,在“变量值”后面加上“;D:\PHP5\;D:\PHP5\ext”,然后点“确定”退出。环境变量配置完成。(windows下Path环境变量是做什么用,google一下先,这样设置后,系统会自动搜索PHP目录里的可执行文件和加载类库)

5、进入PHP5目录下,找到php.ini-dist文件,将其复制到C盘的WINDOWS目录下,并将其文件名修改为“php.ini”。(php会默认从这个路径找php.ini这个文件,当然也可以手工指定这个目录,修改apache的配置文件即可)

6、再次进入PHP5目录下,将以下文件复制到C盘的WINDOWS目录下的System32里:(原因,我也不太清楚,但貌似可以设置一个环境变量指向这个路径就ok,那个方法一直没找到,也没理解)
fdftk.dll
gds32.dll
libeay32.dll
libmcrypt.dll
libmhash.dll
libmysql.dll
msql.dll
news.txt
ntwdblib.dll

7、打开Apache的主目录,进入conf文件夹,找到“httpd.conf”文件,为操作方便起见,建议使用Dreamweaver打开它。打开后在第126行左右找到 LoadModule vhost_alias_module modules/mod_vhost_alias.so,在后面添加以下语句:
LoadModule php5_module “D:/PHP5/php5apache2_2_filter.dll
“AddType application/x-httpd-php .php
添加完成后保存文件。

8、在apache主目录下htdocs下创建index.php文件,内容为<?php phpinfo(); ?>保存。

9、在浏览器的地址栏里输入http://127.0.0.1/index.php。即可打开显示PHP信息的页面。配置成功。

MYSQL5新特性,分区表

作者 : admin 于 2008年11月15日, 17:57:03
2008
11-15

CU上看了一个介绍mysql5分区表的帖子,很感兴趣,如果有了分区的应用,那么设计数据库结构可以更加紧凑,而在应用上更加灵活,减少了一些不必要的视图,而在速度上也很好的提升。
分区的好处是,在物理上根据规则对表进行分离。
水平分区其实是B树索引物理上又增加了一级,当然要提高检索速度了,因为又多了一个手工索引。
垂直分区,在一些应用上会更加方便,比如discuz程序,帖子标题跟正文都是分离的,目的是降低单表容量,而有了垂直分区,可以在物理上对字段进行分离,而访问的时候又是类似视图的访问,无比爽也!!
目前还没测试分区到底有多少性能潜力可开发,回头用大的数据查询测试一下。
相关资料:http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html

Mysql数据库抽象层操作类

作者 : admin 于 2008年09月08日, 14:26:23
2008
09-8

DB.InterFace.php

  1. < ?php
  2. /*  DB.InterFace.php
  3.  *  DB
  4.  *  @link        http://www.sunboyu.cn
  5.  *  @package     OA
  6.  *  @version     V1.0
  7.  *
  8.  *  2008 08 28  sunboyu@gmail.com
  9.  *  Demo
  10.  */
  11. interface DateBaseConnect
  12. {
  13.     #数据库连接
  14.     public function Connect( $host , $user , $pass , $datebase );
  15. #使用数据库
  16. public function selectDateBase( $datebase );
  17. #执行一个查询
  18. public function Query( $sql );
  19. #取得一行
  20. public function fetchRow( $sql );
  21. #取得所有
  22. public function fetchAll( $sql );
  23. #取得影响行数
  24. public function affectedRow();
  25. #取得结果行数
  26. public function recordCount();
  27. #取得上次插入ID
  28. public function insertID();
  29. #释放资源
  30. public function close();
  31. }
  32. ?>

阅读全部 »

Mysql视图应用

作者 : admin 于 2008年08月28日, 20:55:26
2008
08-28

mysql视图创建方法,以我的OpenOA为例,创建user表left jion user_info表的视图

CREATE VIEW v_user AS SELECT * FROM user LEFT JOIN user_info ON (user.id = user_info.user_id)

然后查看

mysql>use oa

mysql>show tables

结果显示,v_user是库oa中的一个表。因此我们使用的时候,可以直接使用语句 SELECT * FROM v_user

而这句也就等于 SELECT * FROM user LEFT JOIN user_info ON (user.id = user_info.user_id)

而实习在系统中,v_user 只有这么一个文件v_user.frm  也就是只有结构,没有数据和索引.打开后,可以看到详细的存储的内容

TYPE=VIEW
query=select `oa`.`user`.`id` AS `id`,`oa`.`user`.`username` AS `username`,`oa`.`user`.`nickname` AS `nickname`,`oa`.`user`.`password` AS `password`,`oa`.`user`.`lastlogintime` AS `lastlogintime`,`oa`.`user`.`lastloginip` AS `lastloginip`,`oa`.`user`.`loginrand` AS `loginrand`,`oa`.`user_info`.`user_id` AS `user_id`,`oa`.`user_info`.`user_realname` AS `user_realname`,`oa`.`user_info`.`user_sex` AS `user_sex`,`oa`.`user_info`.`user_age` AS `user_age`,`oa`.`user_info`.`user_birthplace` AS `user_birthplace`,`oa`.`user_info`.`user_homeaddress` AS `user_homeaddress`,`oa`.`user_info`.`user_idcard` AS `user_idcard`,`oa`.`user_info`.`user_graduateschool` AS `user_graduateschool`,`oa`.`user_info`.`user_educational` AS `user_educational`,`oa`.`user_info`.`user_graduatetime` AS `user_graduatetime`,`oa`.`user_info`.`user_homephone` AS `user_homephone`,`oa`.`user_info`.`user_cellphone` AS `user_cellphone`,`oa`.`user_info`.`user_workphone` AS `user_workphone`,`oa`.`user_info`.`user_fax` AS `user_fax`,`oa`.`user_info`.`user_email` AS `user_email`,`oa`.`user_info`.`user_oicq` AS `user_oicq`,`oa`.`user_info`.`user_msn` AS `user_msn` from (`oa`.`user` left join `oa`.`user_info` on((`oa`.`user`.`id` = `oa`.`user_info`.`user_id`)))
md5=19f7a28463ad7447c3b4cc5428888fa6
updatable=0
algorithm=0
definer_user=root
definer_host=localhost
suid=1
with_check_option=0
revision=1
timestamp=2008-08-28 11:58:17
create-version=1
source=SELECT * FROM user LEFT JOIN user_info ON ( user.id = user_info.user_id )

都是啥意思,没有深究,只是能根据字面猜出来,如果只是用,到此位置即可。

使用mysql保存session,并建立在线用户列表

作者 : admin 于 2008年08月15日, 23:02:21
2008
08-15

写OA,使用mysql存储session,这样,是为了获得在线用户的列表,为做一个web im做准备。

首先创建表,注,这里使用了adodb中数据字典的描述方法:

  1. $Session_Fields = "
  2. session_id VARCHAR(100) NOTNULL,
  3. session_value X DEFAULT '',
  4. session_expires I(10) DEFAULT NULL,
  5. userid I(5) DEFAULT NULL
  6. ";
  7. $Session_Tables = array('mysql' => "ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci COMMENT = 'session表'");
  8. $dict = NewDataDictionary(GetDB());
  9. $sqlarray = $dict->CreateTableSQL($_CFG['table']['session'], $Session_Fields, $Session_Tables);
  10. $dict->ExecuteSQLArray($sqlarray);

然后session类:

  1. <?php
  2. /*  Session.Class.php
  3.  *  Session Manager
  4.  *  @link        http://www.sunboyu.cn
  5.  *  @package     OA
  6.  *  @version     V1.0
  7.  *
  8.  *  2008 08 14  sunboyu@gmail.com
  9.  */
  10. class Session
  11. {
  12. var $lifetime;
  13. var $db = null;
  14. function __construct()
  15. {
  16. #return adodb lite connetction
  17. $this->db = GetDB();
  18. }
  19. #open
  20. function open( $savepath , $session_name )
  21. {
  22. $this->lifetime =  get_cfg_var("session.gc_maxlifetime");
  23. return true;
  24. }
  25. #close
  26. function close()
  27. {
  28. return true;
  29. }
  30. #read
  31. function read( $session_id )
  32. {
  33. global $_CFG;
  34. $sql = sprintf("SELECT * FROM %s WHERE session_id = %s",$_CFG['table']['session'],GetSqlString( $session_id ));
  35. $rs = $this->db->Execute( $sql );
  36. if($rs->RecordCount()>0)
  37. {
  38. $result = $rs->fields;
  39. return $result['session_value'];
  40. }
  41. else
  42. {
  43. return null;
  44. }
  45. }
  46. #write
  47. function write( $session_id , $session_value )
  48. {
  49. global $_CFG;
  50. $sql = sprintf("SELECT session_id FROM %s WHERE session_id = %s",$_CFG['table']['session'],GetSqlString( $session_id ));
  51. $rs = $this->db->Execute( $sql );
  52. if($rs->RecordCount()==0)
  53. {
  54. $newsql = sprintf("INSERT INTO %s SET session_id = %s , session_value = %s , session_expires = %d",
  55. $_CFG['table']['session'],
  56. GetSqlString( $session_id ),
  57. GetSqlString( $session_value ),
  58. GetSqlString( $this->lifetime+time() , "int" ));
  59. }
  60. else
  61. {
  62. $newsql = sprintf("UPDATE %s SET session_value = %s , session_expires = %d WHERE session_id = %s",
  63. $_CFG['table']['session'],
  64. GetSqlString( $session_value ),
  65. GetSqlString( $this->lifetime+time() , "int" ),
  66. GetSqlString( $session_id ));
  67. }
  68. return $this->db->Execute( $newsql );
  69. }
  70. #destroy
  71. function destroy( $session_id )
  72. {
  73. global $_CFG;
  74. $delsql = sprintf("DELETE FROM %s WHERE session_id = %s",$_CFG['table']['session'],GetSqlString( $session_id ));
  75. return $this->db->Execute( $delsql );
  76. }
  77. #gc
  78. function gc()
  79. {
  80. global $_CFG;
  81. $gcsql = sprintf("DELETE FROM %s WHERE session_expires < %d",$_CFG['table']['session'],time());
  82. return $this->db->Execute( $gcsql );
  83. }
  84. }
  85. ?>

session机制,之前已经介绍,实现代码如下

  1. $session = new Session();
  2. session_set_save_handler(array(&$session,"open"),
  3. array(&$session,"close"),
  4. array(&$session,"read"),
  5. array(&$session,"write"),
  6. array(&$session,"destroy"),
  7. array(&$session,"gc"));
  8. session_start();

把session与用户id对应,使用以下语句即可

  1. sprintf("UPDATE %s SET userid = %d WHERE session_id = %s",$_CFG['table']['session'],GetSqlString($rs['id'],'int'),GetSqlString(session_id(),'text'))

使用Mysql来存储Session

作者 : admin 于 2008年07月31日, 22:39:29
2008
07-31

接上篇,我们已经知道session的具体存储机制,我们来尝试修改一下这个机制,让数据存储在mysql数据库中。

mysql有三部分的内容,session session_data session_expires分别为session的id session的内容,session的过期时间。

创建这样一个数据库

CREATE TABLE IF NOT EXISTS `sessions` (
`session` varchar(255) character set utf8 collate utf8_bin NOT NULL,
`session_expires` int(10) unsigned NOT NULL default ‘0′,
`session_data` mediumtext collate utf8_unicode_ci,
KEY `session` (`session`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

相对于文件方式的session存储,这两个函数是不用动的
function open($save_path, $session_name)
{
global $sess_save_path;

$sess_save_path = $save_path;
return(true);
}

function close()
{
return(true);
}
而需要修改的是读,写,删,过期操作的函数

读的操作,很简单,只是从数据库中,根据sessionid,读出date字段中的内容
function read($sessID) {
global $php_errormsg;
// fetch session-data
$query = ”
SELECT session_data FROM sessions
WHERE session = ‘$sessID’
AND session_expires >
“.time();
$result = $this->mdb2->query($query);
// return data or an empty string at failure
if (MDB2::isError($result)) {
$php_errormsg .= $result->getMessage();
$php_errormsg .= $result->getDebugInfo ();
return false;
}
list($value)=@$result->fetchrow();
return $value;
}
同理,写的操作就是update数据,destory的操作为删除session的记录,另外有个gc的操作是删除过期的session。
具体的代码没有去实现,但在PHP手册上都有。同时手册还介绍了memcache储存的方式,效率应该会不错的。

这是本月最后一篇日志,也算为下月找个题。

 Page 1 of 3  1  2  3 »