用友优普ibdata1文件过大的解决
warning:
这篇文章距离上次修改已过290天,其中的内容可能已经有所变动。
用友优普ibdata1文件过大的解决
一、现象
一个很古老的用友u8系统,已经运行N年了,某天突然报磁盘不足,用户登录不了。经远程查看,发现数据盘200G全占满了。再看了下三个帐套数据库,每个也就20G左右,确定不是业务数据库的问题。于是用everything查询最大的文件,很快就定位到了问题所在,U8SOFT\RasMini\rasdepend\RasDB\data
中ibdata1文件竟然占用70多G!
RasMini是用友优普远程接入的应用,使用浏览器即可登录用友,用户不需要安装庞大的客户端,跟微软的remoteApp差不多。
二、处理
定位到问题后,接下来就是要处理ibdata文件了。==操作前先备份数据库存==,这是行规!想用navicat连接上去,才发现root密码并非用友管理员密码。然后用vscode在RasMini目录里搜了很久,也没找到有用的密码,索性放弃,直接新建一个用户!那这里又要用到mysql数据库的知识了,下面复习一遍:
- 停止mysql服务
Ras Database Service
- 在数据库目录,打开cmd,输入mysqld --skip-grant-tables回车(==这个窗口不要关闭==)
- 在上面的目录里再次打开新的cmd,输入mysql
- flush privileges;(==必须先执行这行==)
CREATE USER 'username'@'localhost' IDENTIFIED BY PASSWORD('password'); GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost'; FLUSH PRIVILEGES;
重启mysql。
这时用navicat可以连接上去了,想备份数据库,发现备份非常慢,猜测是某个表数据量大造成的。通过执行下面语句可以知道所有表的记录数。
use information_schema; select table_name,table_rows from tables where TABLE_SCHEMA = 'xxxx' order by table_rows desc;
果然,lograssessi表竟然有几千万条记录。看表名猜测是日志文件,随便select几条数据,确认了判断。通过手动登录退出用友,再select这个表,再次确认了。为确保安全,想直接删除前几千万条数据(此前已对整个系统数据进行了全备份),但是报错:
[SQL] delete from lograssessi where id<381694000; [Err] 1206 - The total number of locks exceeds the lock table size
数据量太大,不能这么直接删除。那就复制表结构吧。复制完后drop那个表,瞬间完成了!然把xxx表名改为lograssessi。
create table xxx select * from lograssessi where 1=2;
重启mysql,发现ibdata1还是超级大,查了下百度,innodb在数据删除后不会自动收缩ibdata文件,最简单的方式是通过重创建数据库来实现文件收缩,那就动手吧。
* navicat导出`rasdatabase`数据库,由于清空了lograssessi,速度超快!
* 停止mysql
* `U8SOFT\RasMini\rasdepend\RasDB\data`将ib开头的三个文件和`rasdatabase`删除
* 启动mysql,重新建`rasdatabase`,导入数据库,此时ibdata缩小至10多M!
## 三、其他
像上面的日志,其实没必要保存N年的,或者应该给用户提醒,让用户自行备份再清除!不过这毕竟是10多年前的产品,不能要求太多!
除了数据库文件外,`U8SOFT\RasMini\rasweb\Apache2\logs`这里面的access.log文件也达到1G多,在服务里把所有ras开头的服务停止,再将logs里的文件全部删除,重新打开服务,就可以了!
评论已关闭