背景:目前线上一直在跑的hadoop集群使用的是cdh4.7.1版本,之所以版本这么低是因为运行的时间比较久远了,然后因为各种原因也没有升过级。
集群中使用的是mysql来存储hive的元数据,但很可笑的是之前一直没有对mysql做过主从或是定期dump操作来备份数据,不过幸运的是这台mysql服务足够的坚挺,一直没有出现过问题。
但随着业务量的不断增加,本人决定铤而走险,先做一个主从来确保元数据没有问题,然后再找时间来升级整个集群。
理论上做一个mysql的主从服务,对集群应该没有什么影响,最多就是重启一下mysql,也就是一瞬间的事。没想到的是mysql的ibdata1文件竟然已经跑到了100+GB,只好先把它变小,具体做法:
1. 备份数据库
a. 首先要保证数据没有写入,可以限制一下端口
b. 为了防止操作失误出现数据有问题,所以最好换一个mysql的本地路径,如果出了问题直接切换回去就好了
c. 备份操作:mysqldump -q -umysql -ppassword --add-drop-table --all-databases > /xxx/all.sql
2. 停止数据库
service mysqld stop
3. 删除ibdata1文件
rm /var/lib/mysql/var/ibdata1
4. 修改my.cnf文件
[mysqld]下增加下面配置
innodb_file_per_table=1
验证配置是否生效,可以重启mysql后,执行
show variables like '%per_table%'
看看innodb_file_per_table变量是否为ON
5. 重启mysql,并导入数据
service mysqld start
mysql -uusername -pyourpassword < /xxx/all.sql
然后开始做主从服务,此处暂略
当mysql正常运行后,启动集群及cm各项服务,发现Service Monitor、Activity Monitor、Host Monitor 三个服务均启动失败,查看日志
ERROR main:com.cloudera.enterprise.dbutil.DbUtil: InnoDB engine not found. Show engines reported: [MRG_MYISAM, CSV, MyISAM, MEMORY]
ERROR main:com.cloudera.server.cmf.bootstrap.EntityManagerFactoryBean: InnoDb engine isn’t present or enabled. SCM requires InnoDb MySQL db engine
意思是:部分数据表需要InnoDB,但实际是MyISAM或其他。
想要解决这个问题,只能修改mysql数据表的引擎,要么修改my.cnf配置 default-storage-engine=InnoDB 这样所有的表就都变成InnoDB了,不过前提是要先dump数据,修改引擎,然后再导入数据。
这个操作比较麻烦了。而且其他的数据表也不需要修改成InnoDB,所以决定修改单表的存储引擎,具体操作如下:
停掉mysql服务,删除/var/lib/mysql/文件夹下的ibdata1、ib_logfile0、ib_logfile1三个文件,重新启动mysql
重启Service Monitor、Activity Monitor、Host Monitor三个服务观察日志,报错变成了:
ERROR com.cloudera.enterprise.dbutil.DatabaseManager: Tables have unsupported engine type [MyISAM]. InnoDB is required. Table mapping: {MyISAM=[CMON_LL_DP_2017_03_26_22, CMON_LL_DP_2017_03_26_23, CMON_LL_DP_2017_03_28_21, CMON_LL_DP_2017_03_28_20, CMON_LL_DP_2017_03_28_23, CMON_LL_DP_2017_03_28_22, CMON_LL_DP_2017_03_26_21, CMON_LL_DP_2017_03_26_20
现在要做的是逐一修改三个服务对应的数据库中的每一张表的存储引擎:alter table xxxx engine=innodb; 或者 像上面说的,dump数据,修改引擎然后重新导入数据,我选择的是逐一修改,但后来发现,这些表仅是用来记录监控数据,所以直接暴利删除,留下有用的数据表修改引擎即可
做完操作后发现Service Monitor、Activity Monitor、Host Monitor三个服务已启动正常。然后发现,新建的数据表引擎也已经变成了InnoDB。