core: Database error during schema migration 'Index column size too large. The maximum column size is 767 bytes.'

The problem

I Updated HA a few days ago. I am not sure from which version, could be core_2021.5.5. After the reboot, I received a notification that the database migration failed.

I am using MariaDB on a different host.

The database URL first was: mysql://username:password@192.168.222.4/homeassistant

After the failed migration I added the charset option: mysql://username:password@192.168.222.4/homeassistant?charset=utf8mb4

But after a reboot the migration still fails.

What is version of Home Assistant Core has the issue?

core-2021.6.3

What was the last working version of Home Assistant Core?

No response

What type of installation are you running?

Home Assistant OS

Integration causing the issue

recorder

Link to integration documentation on our website

https://www.home-assistant.io/integrations/recorder

Example YAML snippet

mysql://username:password@192.168.222.4/homeassistant?charset=utf8mb4

Anything in the logs that might be useful for us?

Logger: homeassistant.components.recorder.util
Source: components/recorder/util.py:68
Logger: homeassistant.components.recorder.migration
Source: components/recorder/migration.py:58
Integration: Recorder (documentation, issues)
First occurred: June 10, 2021, 4:33:08 PM (1 occurrences)
Last logged: June 10, 2021, 4:33:08 PM

Database is about to upgrade. Schema version: 14

Integration: Recorder (documentation, issues)
First occurred: June 10, 2021, 4:33:08 PM (1 occurrences)
Last logged: June 10, 2021, 4:33:08 PM

Error executing query: (MySQLdb._exceptions.OperationalError) (1709, 'Index column size too large. The maximum column size is 767 bytes.') [SQL: CREATE INDEX ix_statistics_statistic_id_start ON statistics (statistic_id, start)] (Background on this error at: http://sqlalche.me/e/14/e3q8)

Logger: homeassistant.components.recorder
Source: components/recorder/migration.py:450
Integration: Recorder (documentation, issues)
First occurred: June 10, 2021, 4:33:08 PM (1 occurrences)
Last logged: June 10, 2021, 4:33:08 PM

Database error during schema migration
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1763, in _execute_context
    self.dialect.do_execute(
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 717, in do_execute
    cursor.execute(statement, parameters)
  File "/usr/local/lib/python3.8/site-packages/MySQLdb/cursors.py", line 206, in execute
    res = self._query(query)
  File "/usr/local/lib/python3.8/site-packages/MySQLdb/cursors.py", line 319, in _query
    db.query(q)
  File "/usr/local/lib/python3.8/site-packages/MySQLdb/connections.py", line 259, in query
    _mysql.connection.query(self, query)
MySQLdb._exceptions.OperationalError: (1709, 'Index column size too large. The maximum column size is 767 bytes.')

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/recorder/__init__.py", line 683, in _migrate_schema_and_setup_run
    migration.migrate_schema(self, current_version)
  File "/usr/src/homeassistant/homeassistant/components/recorder/migration.py", line 64, in migrate_schema
    _apply_update(instance.engine, session, new_version, current_version)
  File "/usr/src/homeassistant/homeassistant/components/recorder/migration.py", line 450, in _apply_update
    Statistics.__table__.create(engine)
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/schema.py", line 943, in create
    bind._run_ddl_visitor(ddl.SchemaGenerator, self, checkfirst=checkfirst)
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 3075, in _run_ddl_visitor
    conn._run_ddl_visitor(visitorcallable, element, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 2074, in _run_ddl_visitor
    visitorcallable(self.dialect, self, **kwargs).traverse_single(element)
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/visitors.py", line 483, in traverse_single
    return meth(obj, **kw)
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/ddl.py", line 902, in visit_table
    self.traverse_single(index, create_ok=True)
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/visitors.py", line 483, in traverse_single
    return meth(obj, **kw)
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/ddl.py", line 933, in visit_index
    self.connection.execute(CreateIndex(index))
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1258, in execute
    return meth(self, multiparams, params, _EMPTY_EXECUTION_OPTS)
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/ddl.py", line 77, in _execute_on_connection
    return connection._execute_ddl(
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1348, in _execute_ddl
    ret = self._execute_context(
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1806, in _execute_context
    self._handle_dbapi_exception(
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1987, in _handle_dbapi_exception
    util.raise_(
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 211, in raise_
    raise exception
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1763, in _execute_context
    self.dialect.do_execute(
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 717, in do_execute
    cursor.execute(statement, parameters)
  File "/usr/local/lib/python3.8/site-packages/MySQLdb/cursors.py", line 206, in execute
    res = self._query(query)
  File "/usr/local/lib/python3.8/site-packages/MySQLdb/cursors.py", line 319, in _query
    db.query(q)
  File "/usr/local/lib/python3.8/site-packages/MySQLdb/connections.py", line 259, in query
    _mysql.connection.query(self, query)
sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1709, 'Index column size too large. The maximum column size is 767 bytes.')
[SQL: CREATE INDEX ix_statistics_statistic_id_start ON statistics (statistic_id, start)]
(Background on this error at: http://sqlalche.me/e/14/e3q8)

Additional information

No response

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Comments: 20 (13 by maintainers)

Most upvoted comments

I added innodb_default_row_format = dynamic to my MariaDB config (the other options I already had set) and now the upgrade works. Thanks!

innodb_default_row_format = dynamic was also one of the suggested commands. It seems this one did the trick.