用友优普ibdata1文件过大的解决

用友优普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里的文件全部删除,重新打开服务,就可以了!

评论已关闭