mysql数据库大小的限制
By admin
- 4 minutes read - 804 words使用PHP实现的程序.花了一个下午去完成…
只是做出来让大家参考一下…献丑了….
程序思路:
一\与MYSQL数据库结合.先在MYSQL数据库另起一个库.记录数据库的库名,对应的用户名,限制的大小.等…..
二\系统检测数据库大小,然后对比记录着的资料.对比是否超过流量.如果超过流量就使用MYSQL的ROOT权.限制用户对该数据库的权限…(删除UPDATE\INST..等)
三\如果达到80%.就向管理员\用户各发送一个EMAIL通知..
四\前台程序控制数据库资料的整理…
系统分二个部份.
第一部份.是系统定时检测数据库大小,再根据检测结果与数据库资料.判断数据库是否超大….该部份操作需要有MYSQL高权限用户去完成(建议ROOT).用该文件需要定时运行.,但该文件可以放在网站访问不到的保密地方…
所有文件.打包下载.
http://www.xingkong.biz/mysql_limit.zip
CODE:[Copy to clipboard] //设置部分
$id=mysql_connect(‘localhost’,’user’,’password’); //最好是使用root,或者高权限用户
//FUN部份
function PMA_backquote($a_name, $do_it = TRUE) // 取自phpmyadmin,用来格式化数据库名
{
if ($do_it
&& !empty($a_name) && $a_name != ‘*’) {
if (is_array($a_name)) {
$result = array();
reset($a_name);
while(list($key, $val) = each($a_name)) {
$result[$key] = ‘’ . $val . ‘
’;
}
return $result;
} else {
return ‘’ . $a_name . ‘
’;
}
} else {
return $a_name;
}
} // end of the ‘PMA_backquote()’ function
function limit($user,$db) //达到限制限制用户权限后运行的程序
{
$query=’REVOKE INSERT ,UPDATE ,CREATE ON “‘.$db.’”.* FROM “‘.$user.’@localhost’;//将insert update create的权限移走。01/17修正大BUG
$result = @mysql_query($query);//changed! only 1 query….
//相应的权限代码可以再更改.
//echo ‘lim.debug’;exit;
}
function warning($name,$email) //超过80%时通知用户
{
$admin_email=’admin@admin.com’; //管理员EMAIL地址。请更改
$message=’MYSQL用户:’.$name.’的数据库已超过系统允许的大小的80% /n 请及时整理数据’; //通知的内容可以更改
@mail($admin_email,’MYSQL报告’,$message,’from:mysql@admin.com’);
@mail($email,’MYSQL大小警告’,$message,’from:mysql@admin.com’);
//echo ‘warning.debug’;exit;
}
//以下一段内容来自phpMyAdmin的查询每个数据库大小的程序
$dbs = mysql_list_dbs() ;
while ($a_db = mysql_fetch_object($dbs)) { //查询数据名,以后一段代码来自phpmyadmin
$dblist[] = $a_db->Database;
} // end while
mysql_free_result($dbs);
$num_dbs = count($dblist);
$total_array[0] = 0; // number of tables
$total_array[1] = 0; // total data size
$total_array[2] = 0; // total index size
$total_array[3] = 0; // big total size
// Gets the tables stats per database
for ($i = 0; $i < $num_dbs; $i++) {
$db = $dblist[$i];
$tables = mysql_list_tables($db);
// Number of tables
if ($tables) {
$dbs_array[$db][0] = mysql_numrows($tables);
mysql_free_result($tables);
} else {
$dbs_array[$db][0] = 0;
}
$total_array[0] += $dbs_array[$db][0];
// Size of data and indexes
$dbs_array[$db][1] = 0; // data size column
$dbs_array[$db][2] = 0; // index size column
$dbs_array[$db][3] = 0; // full size column
$local_query = ‘SHOW TABLE STATUS FROM ‘ . PMA_backquote($db);
//echo $db;
$result = @mysql_query($local_query);
// needs the “@” below otherwise, warnings in case of special DB names
if ($result ) {
while ($row = mysql_fetch_array($result)) {
$dbs_array[$db][1] += $row[‘Data_length’];
$dbs_array[$db][2] += $row[‘Index_length’];
}
$dbs_array[$db][3] = $dbs_array[$db][1] + $dbs_array[$db][2];
$total_array[1] += $dbs_array[$db][1];
$total_array[2] += $dbs_array[$db][2];
$total_array[3] += $dbs_array[$db][3];
// echo $dbs_array[$db][3].”
”;
mysql_free_result($result);
} // end if
} // end for
//查询数据库完毕。
//以下代码用来判断数据库大小是否达到限制等。。。。
mysql_select_db(‘db_limit’,$id); //db_limit数据库名可自由更改。但需要与其它程序保持一致
for ($i = 0; $i < $num_dbs; $i++) {
$db=$dblist[$i];
$query=’select * from dbs where db_name=”‘.$db.’”‘;
$result=mysql_query($query);
if ($result)
{
$dbs_limit=mysql_fetch_array($result);
$limit_size=$dbs_limit[‘db_limit_size’];
$user=$dbs_limit[‘db_user’];
$limited=$dbs_limit[‘db_has_limit’];
$used_size=$dbs_limit[‘db_size_used’];
$email=$dbs_limit[‘db_email’];
$warning_size=$limit_size*0.8; //0.8=80%,你可以更改为其它比例
if ($user!=”){ //这
if ($dbs_array[$db][3] > $limit_size)
if ($dbs_array[$db][3] > $warning_size) warning($user,$email);
$query=’update dbs set db_has_limit=”‘.$limited.’” , db_size_used=”‘.$dbs_array[$db][3].’” where db_name=”‘.$db.’”‘;
$result=mysql_query($query); //更新数据库大小至数据资料库
}
//echo $query;exit;
}
}
mysql_close($id);
//欢迎大家加以修改。但改完后。请到 http://www.discuz.net/forumdisplay.php?fid=34 发表修改结果
?>
第二部份为前台管理系统.
这只是最简单的作品.请大家尽快做一个更好的前台出来..
main.php
CODE:[Copy to clipboard] //Bendy 的mysql限额前台程序
$admin=”;session_start();
require (“./config.php”);
if ($adpass==$adminpass)
{
$admin=’ok’;
session_register (“admin”);$admin=’ok’;
}
if ($admin==”)
{
?>
管理
请先登陆,管理密码是:
exit;
}
?>
add.php
CODE:[Copy to clipboard] //Bendy 的mysql限额前台程序
$admin=”;session_start();
require (“./config.php”);
if ($admin==”)
{
echo ‘ login first’;
exit;
}
if ($db_name!=”)
{
$id=mysql_connect(“localhost”,$user,$pass);
mysql_select_db(‘db_limit’,$id);
$query=”insert into dbs values (‘$db_name’,’$db_user’,’$email’,’$db_limit’,”,”)”;
$result=mysql_query($query);
echo “insert success “;
mysql_close($id);
}
?>
添加用户到数据库
添加用户到数据库
数据库名:
用户名:
限制的大小:字节
通知的EMAIL:
config.php
CODE:[Copy to clipboard] //Bendy 的mysql限额前台程序
$user=”root”; //该用户只需要对系统的db_limit数据库有访问权.不需要ROOT权
$pass=”123654″; //密码
$adminpass=”bendy”; //进入前台的管理密码
?>
list.php CODE:[Copy to clipboard] //Bendy 的mysql限额前台程序
$admin=”;session_start();
require (“./config.php”);
if ($admin==”)
{
echo ‘ login first’;
exit;
}
$id=mysql_connect(“localhost”,$user,$pass);
mysql_select_db(‘db_limit’,$id);
?>
list
$query=”select * from dbs”;
$result=mysql_query($query);
while ($list=mysql_fetch_array($result))
{
if ($list[‘db_has_limit’]==’1′)
{$limit=’ 是|重开’;} //change for fix.php
else
echo “”;
}
?>
数据库名用户名限额已用EMAIL限制修改删除$list[db_name]$list[db_user]$list[db_limit_size]$list[db_size_used]$list[db_email]$limit修改删除
edit.php
CODE:[Copy to clipboard] //Bendy 的mysql限额前台程序
$admin=”;session_start();
require (“./config.php”);
if ($admin==”)
{
echo ‘ login first’;
exit;
}
$id=mysql_connect(“localhost”,$user,$pass);
mysql_select_db(‘db_limit’,$id);
if ($dbname==”)
{
echo “edit what? goto list”;
exit;
}
if ($submit!=”)
{
$query=”update dbs set db_user=’$dbuser’,db_limit_size=’$limit’,db_email=’$email’ ,db_has_limit=’0′ where db_name=’$dbname’”;
$result=mysql_query($query);
echo “edit success? goto list”;
exit;
}
$query=”select * from dbs where db_name=’$dbname’”;
$result=mysql_query($query);
$edit=mysql_fetch_array($result);
?>
数据库名:
用户名: “>
限制的大小:”>字节
通知的EMAIL: ” >
”>
del.php
CODE:[Copy to clipboard] $admin=”;session_start();
require (“./config.php”);
if ($admin==”)
{
echo ‘ login first’;
exit;
}
$id=mysql_connect(“localhost”,$user,$pass);
mysql_select_db(‘db_limit’,$id);
if ($dbname==”)
{
header(“location:list.php”);
exit;
}
$query=”delete from dbs where db_name=’$dbname’”;
$result=mysql_query($query);
echo “delete success ,goto list”;
?>
还有!!!
在MYSQL建立一个
db_limit
的数据库.
导入以下内容 CODE:[Copy to clipboard]
database : db_limit
CREATE TABLE dbs
(
db_name
varchar(64) NOT NULL default ”,
db_user
varchar(64) NOT NULL default ”,
db_email
varchar(64) NOT NULL default ”,
db_limit_size
int(10) NOT NULL default ‘0’,
db_has_limit
int(10) NOT NULL default ‘0’,
db_size_used
int(10) NOT NULL default ‘0’
) TYPE=MyISAM;
MENU.html
CODE:[Copy to clipboard]
menu
QUOTE: 引用自uplinux 的
就算利用 php 来写检测,也仍然可以实现自动运行的。
crobtab
- 0 * * * /usr/lcoal/php4/bin/php /home/master/mysql.php
将本系统的脚本放在一个安全的地方.(如果可以让网页访问.也可以,这样的好处是用户可以随时更新信息)
每天0点执行这个php脚本,PHP 文件中想怎么写就怎么写了。
加一个程序
init.php快速建立数据库资料系统
CODE:[Copy to clipboard] //初始数据库系统,使用本程序。可以快速建立本地用户系统资料库。
//暂时只能快速建立数据库名=用户名的系统。有意者。可以建立数据库名与用户名不同的资料库。。。。。
$id=mysql_connect(‘localhost’,’user’,’password’); //最好是使用root,或者高权限用户
$dbs = mysql_list_dbs() ;
while ($a_db = mysql_fetch_object($dbs)) { //查询数据名,以后一段代码来自phpmyadmin
$dblist[] = $a_db->Database;
} // end while
mysql_free_result($dbs);
$num_dbs = count($dblist);
mysql_select_db(‘db_limit’,$id);
$init_size=’100000000′; //初始限制大小(字节数)
for ($i = 0; $i < $num_dbs; $i++) {
$query=”insert into dbs values (‘$dblist[$i]’,’$dblist[$i]’,”,’$init_size’,”,”)”;
$result=mysql_query($query);
}
mysql_close($id);
?>
补充一个….恢复用户权限..
CODE:[Copy to clipboard] $admin=”;session_start();
require (“./config.php”);
if ($admin==”)
{
echo ‘ login first’;
exit;
}
$id=mysql_connect(“localhost”,’root’,’rootpass’); //这里需要ROOT权限!!!
mysql_select_db(‘db_limit’,$id);
if ($dbname==”)
{
header(“location:list.php”);
exit;
}
$query=”select * from dbs where db_name=’$dbname’”;
$result=mysql_query($query);
$fix=mysql_fetch_array($result);
$query=’GRANT INSERT ,UPDATE ,CREATE ON “‘.$fix[db_name].’”.* TO “‘.$fix[db_name].’@localhost’;
$result=mysql_query($query);
$query=”update dbs set db_has_limit=0 where db_name=$fix[db_name]”;
$result=mysql_query($query);
echo “fix success ,but you must change the limit , If not ,system will limit it again! goto list”;
?>
Originally posted by zhnag at 2004-1-9 05:46 PM:
http://www.xingkong.biz/mysql_limit.zip