OpenStack Error – Index column size too large. The maximum column size is 767 bytes [Solved]

本文介绍了解决OpenStack部署过程中因MySQL字符集设置不当导致的数据库同步错误的方法。主要包括调整配置文件中的字符集设置、重启MySQL服务、删除并重建相关数据库等步骤。

文章原地址   https://techglimpse.com/openstack-db-sync-error-mysql-character-set-solution/


执行  

# su -s /bin/sh -c "keystone-manage db_sync" keystone

时出现错误:CRITICAL keystone [-] DBError: (pymysql.err.InternalError) (1071, u'Specified key was too long; max key length is 767 bytes') [SQL: u'\nCREATE TABLE migrate_version (\n\trepository_id VARCHAR(250) NOT NULL, \n\trepository_path TEXT, \n\tversion INTEGER, \n\tPRIMARY KEY (repository_id)\n)\n\n']


Overall, you need to perform below steps:

  1. Replace utf8mb4 to utf8 in all configuration files
  2. Reload mysqld daemon
  3. Drop database keystone or glance or nova or neutron (for whichever service you were getting error and don’t worry, you haven’t populated the database yet and it’s safe to remove)
  4. Create database keystone or glance or nova or neutron
  5. Try db_sync or populate the database using OpenStack commands. It should probably work, else try Fix 2.
解决方案:

               1.将/etc/mysql/mariadb.conf.d目录下的所有.cnf文件中出现uft8mb4的地方都修改成uft8

                2.重启数据库  service mysql restart

                3.进入数据库把建立的keystone数据库删除

                4.重新建立keystone数据库

                5.输入su -s /bin/sh -c "keystone-manage db_sync" keystone  应该就可以运行了,不行的话实时Fix2.




同时推荐文章http://blog.youkuaiyun.com/zhujie_hades/article/details/52104116


### 问题分析 在 OpenStack 环境中,当用户尝试设置权限或创建新用户时遇到 `user_already_exists` 错误,通常表明系统中已经存在具有相同名称的用户。OpenStack 的身份认证服务(Keystone)要求所有用户的用户名在域范围内是唯一的,若重复提交相同用户名的操作,将触发该错误。 此问题可能由以下几种情况引起: - **手动重复创建用户**:在未检查用户是否已存在的前提下,直接执行了创建用户的命令。 - **脚本或自动化工具重复执行**:例如 Ansible Playbook、Shell 脚本等,在未做幂等性判断的情况下多次运行,导致冲突。 - **域隔离配置不当**:不同域之间若未正确配置命名空间,可能导致用户名称冲突。 - **数据库残留记录**:在删除用户后,由于 Keystone 数据库未完全清理,导致旧用户信息仍然存在,从而在重新创建同名用户时失败。 --- ### 解决方案 #### 检查用户是否存在 在尝试创建用户前,应先确认目标用户是否已经存在。使用以下命令列出当前所有用户以进行验证: ```bash openstack user list ``` 如果发现目标用户名已经在列表中,则无需再次创建。若需要修改其权限,可跳过创建步骤,直接为其分配角色。 #### 查看用户所属项目与角色 若用户已存在但未被正确授权,可通过以下命令查看其当前的角色分配: ```bash openstack role assignment list --user <username> --project <project-name> ``` 如发现缺少必要角色,可以使用如下命令为用户添加角色: ```bash openstack role add <role-name> --user <username> --project <project-name> ``` 这种方式避免了重复创建用户,仅对权限进行调整[^1]。 #### 清理无效用户记录 若确认用户已被删除但仍报 `user_already_exists` 错误,可能是 Keystone 数据库中仍保留了相关记录。此时可尝试进入数据库手动清理: ```sql DELETE FROM keystone.user WHERE name = '<username>'; ``` 操作前务必备份数据库,并确保 OpenStack 服务处于停止状态以防止数据不一致。 #### 使用条件判断避免冲突 在编写自动化脚本时,建议加入用户是否存在判断逻辑,例如在 Bash 中: ```bash if ! openstack user show <username> > /dev/null 2>&1; then openstack user create <username> --password <password> fi ``` 该方式确保只有在用户不存在时才执行创建操作,避免因重复创建引发错误。 --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值