当前HiveMetaStore(HMS)的Mysql元数据存储的字符集是latin1,鉴于公司DBA运维平台的一些限制要求,需要将字符集修改为utf8…
1 修改server默认字符集
my.ini配置修改
1 | character_set_server = utf8 |
修改该配置后,需要重启 mysql server
1 | show veriables like 'character%'; |
2 修改数据库
1 | alter database <db_name> character set utf8; |
修改完数据库字符集, 需要重启mysql数据库
3 修改表字符集
3.1 修改单表的字符集
1 | alter table <table_name> default character set utf8 collate utf8_general_ci; |
3.2 批量修改库下所有表的字符集
回滚方案:
字符集修改是有风险的,所以我们一定要制定好备份回滚方案。一个没有考虑备份回滚方案的升级后果不敢想象。
1 | mysql -h${HOST} -u${USER_NAME} -p${PASSWORD} -N -e "select concat('alter table \`', b.table_name, '\` default character set latin1 collate ', b.table_collation, ' ;') from information_schema.schemata a, information_schema.tables b where a.schema_name = b.table_schema and b.table_schema = '$DB' ;" > alter_table_character_backup.sql |
升级方案:
1 | mysql -h${HOST} -u${USER_NAME} -p${PASSWORD} -N -e "select concat('alter table \`', b.table_name, '\` default character set utf8 collate utf8_general_ci ;') from information_schema.schemata a, information_schema.tables b where a.schema_name = b.table_schema and b.table_schema = '$DB' ;" > alter_table_character.sql |
4 修改字段字符集
4.1 修改单个字段的字符集
1 | alter table <table_name> change <col_name> <col_name> <col_type> character set uft8 collate utf8_general_ci null default null; |
4.2 批量修改库下所有表字段的字符集
回滚方案:
1 | mysql -h${HOST} -u${USER_NAME} -p${PASSWORD} -N -e "select concat('alter table \`', a.table_name, '\` modify \`', a.column_name,'\` ', a.column_type, ' character set latin1 collate ', a.collation_name, case when a.is_nullable = 'NO' then ' not null' else '' end, ' ;') from information_schema.columns a where a.table_schema = '$DB' and character_set_name = 'latin1';" > alter_column_character_backup.sql |
升级方案:
1 | mysql -h${HOST} -u${USER_NAME} -p${PASSWORD} -N -e "select concat('alter table \`', a.table_name, '\` modify \`', a.column_name,'\` ', a.column_type, ' character set utf8 collate utf8_general_ci ', case when a.is_nullable = 'NO' then 'not null' else '' end, ' ;') from information_schema.columns a where a.table_schema = '$DB' and character_set_name = 'latin1';" > alter_column_character.sql |
5 实战案例
将升级过程程式化,让升级经过简单化。
5.1 升级包结构
1 | . |
说明:
result: 该目录下存放升级后结果验证文件。比对 before_character.info 和 after_character.info 验证升级是否成功; 比对before_character.info 和 after_rollback_character.info 验证回滚是否成功。
script:该目录下的升级脚本都是动态生成的,以匹配不同的库表信息。
5.2 升级脚本
1 | sh main.sh -service <option> -h <host> -u <userName> -p <passwd> -d <db> |
5.2.1 升级准备
前期准备主要生成升级以及回滚脚本。
1 | sh main.sh -service generateUpgradeScript -h <host> -u <userName> -p <passwd> -d <db> |
5.2.2 升级
1 | sh main.sh -service startUpgrade -h <host> -u <userName> -p <passwd> -d <db> |
5.2.3 回滚
1 | sh main.sh -service rollback -h <host> -u <userName> -p <passwd> -d <db> |
附:升级脚本
1 | !/bin/sh |
本文作者:
Jeff.R
本文链接: https://stefanxiepj.github.io/archives/82a41918.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
本文链接: https://stefanxiepj.github.io/archives/82a41918.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
![知识共享许可协议](https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png)