基于ibdata1的mysql数据库恢复

服务器的阵列坏掉后,数据恢复公司进行了抢救后,大部分数据都恢复回来。但MYSQL数据库发现仅恢复了部分数据,即部分数据库是完整的,其他的库仅恢复了空表。其中有一个很大的文件,即ibdata1,约200多GB,估计可以用来恢复数据库。

网上搜索后,发现是可行的,处理方法如下:

1. 在一台新机器上搭建相同的系统环境,包括一个全新的mysql环境。
2. 停止mysql服务。即sudo service mysql stop
3. 将恢复后的ibdata1、ib_logfile*文件拷贝到新机器的/var/lib/mysql/目录下,覆盖之前的文件。同时修改/etc/mysql/my.cnf文件,在mysqld部分添加:
[mysqld]
innodb_force_recovery = 6

4. 拷贝需要恢复的数据库文件(空表,即包括*.frm文件的目录)到新机器的/var/lib/mysql/目录下
5. 重启mysql服务,即sudo service mysql start,然后用mysql命令检查数据是否有恢复。若能恢复回来,则可以用mysqldump进行备份导出。

piwik: 不能连接mysql数据库

此前运行正常的piwik系统,周末突然发现不工作了,提示:

错误1030,不能连接mysql数据库。

大吃一惊,ssh登陆服务器,mysql登陆后发现数据库都还正常,用root账号可以查看。

同时用:

mysql -upiwik -p -h localhost

 

这个也可以正常工作,非常奇怪。

但用这个则不能登陆:

mysql -upiwik -p -h 127.0.0.1

 

于是修改config.ini.php,修改连接参数,可以正常启用。

但发现本机别的mysql应用都正常,估计是mysql user的问题,于是重新添加该用户,授权到对应host也可以解决此问题。

grant all privileges piwik.* to 'piwik'@'127.0.0.1' identified by 'passwd'

 

apache2高cpu负载的问题检查

数据中心所在服务器同时服务了几十个网站,近日突然发现cpu负载居高不下,导致数据中心网站访问速度超慢,甚至不能访问。

首先检查其中几个可疑的高负载网站,包括2个phpbb论坛,转移到另外一台服务器上,发现问题仍然存在。

通过htop检查,发现问题和mysql直接相关,apache高负载时mysql也同时高负载,尝试将mysq关闭,则问题解决,因此问题肯定在于使用mysql的网站,但使用mysql的网站仍然有很多,需要进一步排除。

在网上搜索发现serverfault上有一个相关性很高的帖子:
Tracking Apache by VirtualHost
其中,提到了一个方法找出高负载时访问最多的网站:

for pid in `pgrep -u www-data`; do find /proc/${pid}/cwd -printf "%l\n" ; done

使用sudo su后运行此命令,发现是有一个网站使用了mediawiki,导致大量攻击,引起了此问题,解决办法很粗暴,将此网站stop即可。

ubuntu hardy下简易的proftpd+mysql配置

1. 安装

sudo aptitude install proftpd proftpd-mysql

2. 配置
/etc/proftpd/proftpd.conf

Include /etc/proftpd/sql.conf

前面的注释去掉
然后修改/etc/proftpd/sql.conf,我的相关配置如下:

SQLBackend mysql
SQLEngine on
SQLAuthenticate on
SQLAuthTypes Plaintext Crypt
SQLConnectInfo ftp@localhost proftp abcde
SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLGroupInfo ftpgroup groupname gid members

3. 创建mysql库
此处请参照Virtual Hosting With Proftpd And MySQL (Incl. Quota) On Ubuntu 8.04 LTS

4. restart proftpd

sudo /etc/init.d/proftpd restart

设置proftpd+mysql的虚拟FTP服务

具体设置参考:http://www.howtoforge.com/proftpd_mysql_virtual_hosting

按照上面的设置完成后,还需要的操作:
1、允许恢复上传
在proftpd.conf里添加一行:

AllowStoreRestart on

2、权限控制
比如,控制只读,可以在文件权限上设置,把写权限去掉,也可以在FTP权限里进行控制。
在FTP里进行权限控制,在相应目录下创建一个.ftpaccess文件,里面内容为:

DENYALL

而专门供上传的目录,需要控制为不可删除:

DENYALL

mysql又出问题了

已经被MYSQL的问题烦恼了很长的时间了,而且一直没有搞清楚问题的原因。
原来已经调整了参数,并且设置了MYSQL每天自动重新启动一次,没想到还是有问题。
最近又出现了too many connections的问题,干脆再次调整参数,从500直接调整到1500了,

2.4 Too many connections错误
如果在你试土连接MySQL时,你得到错误Too many connections,这意味着已经有max_connections个客户连接了mysqld服务器。

如果你需要比缺省(100)更多的连接,那么你应该重启mysqld,用更大的 max_connections 变量值。

注意,mysqld实际上允许(max_connections+1)个客户连接。最后一个连接是为一个用Process权限的用户保留的。通过不把这个权限给一般用户(他们不应该需要它),有这个权限一个管理员可以登录并且使用SHOW PROCESSLIST找出什么可能出错。见7.21 SHOW句法(得到表,列的信息)。

几个相关命令:
mysqladmin version
mysqladmin variable
show processlist
完整信息可以参考:http://phpchina.com/bbs/archiver/tid-3817.html

wordpress mu 1.3中的编码问题

发现wordpress mu 升级到1.3版本了,对应到wordpress 2.3系列。其中,显著的功能就是默认的TAG支持了。但是升级后发现中文乱码,这时因为我的mysql数据库目前默认的编码还是utf8,而wordpress mu目前默认的编码是采用utf8了,因此需要进行修改。

有两种办法处理:
1、修改wordpress mu的代码
找到wp-inlcudes/wp-db.php文件,注释掉这两行:

// if ( !empty($this->charset) && version_compare(mysql_get_server_info(), '4.1.0', '>=') )
// $this->query("SET NAMES '$this->charset'");

2、修改数据库编码,使其和你的wordpress编码相对应
比如,可以修改数据库的编码为utf8。
首先导出:

mysqldump --default-character-set=utf8 -uroot yourdb > yourdb.sql

然后修改此文件,替换所有的utf8为utf8,并在文件头添加:

SET NAMES utf8;
SET CHARACTER_SET_CLIENT=utf8;
SET CHARACTER_SET_RESULTS=utf8;

然后保存为yourdb-utf.sql,在进行数据库的导入工作:

mysql -uroot
mysql>drop database yourdb
mysql >create database yourdb
mysql -uroot yourdb

此处的转换方法参考:转换论坛:webwiz 7.9 -> phpBB3

我为了以后升级的方便,选择了第二种方法进行处理。

检测mysql进程并重启服务

服务器上的mysql老是拖累apache,导致WWW服务不正常,前面修改过对应的mysql参数,但还是不行,因此,就决定设定让系统CRON下面这个脚本,注意脚本来自傅翮鹤 ,我仅仅修改了ubuntu下对应的参数而已。

#!/bin/bash
#check apache,mysql thread and auto reboot service
#Powered by 傅翮鹤 [www.fuhehe.com]
#Date 2007-06-15

#config
MaxApacheThread=100
MaxMysqlThread=50
HttpService=`ls /etc/init.d|grep apache2`
MysqlService=`ls /etc/init.d|grep mysql`

ApacheThread=`ps -A|grep apache2|wc -l`
MysqlThread=`ps -A|grep mysql|wc -l`

NeedReboot=0

if [ $ApacheThread -gt $MaxApacheThread ]
then
NeedReboot=1
fi
if [ $ApacheThread -eq 0 ]
then
NeedReboot=2
fi

if [ $MysqlThread -gt $MaxMysqlThread ]
then
NeedReboot=3
fi
if [ $MysqlThread -eq 0 ]
then
NeedReboot=4
fi

if [ $NeedReboot -eq 1 ]
then
echo "-----------------------------"
echo $(date +"%y-%m-%d %H:%M:%S")
echo "-----------------------------"
echo "Apache:$ApacheThread;Mysql:$MysqlThread."
echo "Apache is busy,reboot"
/etc/init.d/$HttpService stop
/etc/init.d/$HttpService start
elif [ $NeedReboot -eq 2 ]
then
echo "-----------------------------"
echo $(date +"%y-%m-%d %H:%M:%S")
echo "-----------------------------"
echo "Apache:$ApacheThread;Mysql:$MysqlThread."
echo "Apache is down,reboot"
/etc/init.d/$HttpService start
elif [ $NeedReboot -eq 3 ]
then
echo "-----------------------------"
echo $(date +"%y-%m-%d %H:%M:%S")
echo "-----------------------------"
echo "Apache:$ApacheThread;Mysql:$MysqlThread."
echo "Mysql is busy,reboot"
/etc/init.d/$MysqlService stop
/etc/init.d/$MysqlService start
elif [ $NeedReboot -eq 4 ]
then
echo "-----------------------------"
echo $(date +"%y-%m-%d %H:%M:%S")
echo "-----------------------------"
echo "Apache:$ApacheThread;Mysql:$MysqlThread."
echo "Mysql is down,reboot"
/etc/init.d/$MysqlService start
else
echo "-----------------------------"
echo $(date +"%y-%m-%d %H:%M:%S")
echo "-----------------------------"
echo "Apache:$ApacheThread;Mysql:$MysqlThread."
echo "System is normal"
fi

整合phpbb3和svn服务

整合,题目有点大,呵呵。
其实就是把SVN的用户控制交给phpbb3来进行处理。
要求SVN必须采用apache2/mod_auth_mysql来进行控制的。
然后在phpbb3的后台创建一个新的用户组,用于控制可以访问SVN服务的用户。然后在mysql里创建一个视图,提取用户名称和密码。注意,PHPBB3采用的加密方式是直接MD5。假设创建的组名为svn:

create view svnauth (username,passwd,groups) as select users.username,users.user_password,groups.group_name from groups,user_group left join users on user_group.user_id=users.user_id where groups.group_name=”svn” and user_group.group_id=groups.group_id ;

然后在apache2的site文件里设置为:

Auth_MySQL_Encryption_Types PHP_MD5

这样就可以了,具体的操作还需要参考之前的文章:安装subversion: ssl+auth_mysql+mod_svn

估计还需要mysql 5的支持,不知道mysql 4是否支持视图。

apache2下使用mysql进行身份认证

服务器平台为ubuntu feisty,首先确认apache2已经安装好。
然后安装auth-mysql支持并启用此模块:

sudo aptitude install libapache2-mod-auth-mysql
sudo a2enmod auth_mysql

要建立一个数据库用于认证,并建立一个用户表存贮用户信息。

mysql -uroot
create database svn;
grant all on svn.* to svn@localhost identified by ‘mypwd’;
flush privileges;
use svn;
create table auth(
`username` varchar(25) NOT NULL default ”,
`passwd` varchar(25) NOT NULL default ”,
`groups` varchar(25) NOT NULL default ”,
PRIMARY KEY (`username`),
KEY `groups` (`groups`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

然后修改site文件:

Auth_MySQL_Info localhost

">
Options +Indexes FollowSymLinks MultiViews
AllowOverride AuthConfig Options FileInfo Limit
Order allow,deny
Allow from all

创建.htaccess文件:

AuthUserFile /dev/null
AuthBasicAuthoritative off
AuthMYSQL on
AuthMySQL_Authoritative on
AuthMySQL_DB svn
AuthMySQL_Password_Table auth
AuthMySQL_Group_Table auth
AuthMySQL_Empty_Passwords off
AuthMySQL_Encryption_Types Plaintext Crypt_DES
AuthName ""
AuthType Basic


require valid-user
#or
require group group group1

注意问题:
注意这个部分AuthUserFile /dev/null
如果没有这行,apache的error_log中会出现这样的错误:

[error] [client ip] (9)Bad file descriptor: Could not open password file: (null)

如果没有AuthBasicAuthoritative off
会出现错误:

[error] [client ip] user yourusername not found:

参考:
http://www.howtoforge.com/mod_auth_mysql_apache2_debian
http://www.linuxmine.com/79991.html