For this third article of the series dedicated on how a DBA can find the info he needs with MySQL Database Service in Oracle Cloud Infrastructure, we will see how we can find the error log.
When using MySQL DBAAS, the DBA doesn’t have direct access to the files on the filesystem. Hopefully, with MySQL 8.0, the error log is also available in Performance_Schema
.
This is exactly where you will find the information present also in the error log file when using MDS in OCI:
select * from (select * from performance_schema.error_log order by logged desc limit 10) a order by logged\G
*************************** 1. row ***************************
LOGGED: 2023-03-19 08:41:09.950266
THREAD_ID: 0
PRIO: System
ERROR_CODE: MY-011323
SUBSYSTEM: Server
DATA: X Plugin ready for connections. Bind-address: '10.0.1.33' port: 33060, socket: /var/run/mysqld/mysqlx.sock
*************************** 2. row ***************************
LOGGED: 2023-03-19 08:41:09.950328
THREAD_ID: 0
PRIO: System
ERROR_CODE: MY-010931
SUBSYSTEM: Server
DATA: /usr/sbin/mysqld: ready for connections. Version: '8.0.32-u1-cloud' socket: '/var/run/mysqld/mysql.sock' port: 3306 MySQL Enterprise - Cloud.
*************************** 3. row ***************************
LOGGED: 2023-03-19 08:41:09.950342
THREAD_ID: 0
PRIO: System
ERROR_CODE: MY-013292
SUBSYSTEM: Server
DATA: Admin interface ready for connections, address: '127.0.0.1' port: 7306
*************************** 4. row ***************************
LOGGED: 2023-03-19 08:51:09.000200
THREAD_ID: 0
PRIO: Note
ERROR_CODE: MY-013694
SUBSYSTEM: Health
DATA: DISK: mount point='/db', available=84.9G, total=99.9G, used=15.1%, low limit=4.0G, critical=2.0G, warnings=23.2G/13.6G/8.8G
*************************** 5. row ***************************
LOGGED: 2023-03-19 10:49:18.394291
THREAD_ID: 0
PRIO: Warning
ERROR_CODE: MY-010055
SUBSYSTEM: Server
DATA: IP address '10.0.0.159' could not be resolved: Name or service not known
*************************** 6. row ***************************
LOGGED: 2023-03-19 10:49:18.452995
THREAD_ID: 0
PRIO: Warning
ERROR_CODE: MY-010968
SUBSYSTEM: Server
DATA: Can't set mandatory_role: There's no such authorization ID public@%.
*************************** 7. row ***************************
LOGGED: 2023-03-19 10:52:13.818505
THREAD_ID: 0
PRIO: Note
ERROR_CODE: MY-011287
SUBSYSTEM: Server
DATA: Plugin mysqlx reported: '2.1: Maximum number of authentication attempts reached, login failed.'
*************************** 8. row ***************************
LOGGED: 2023-03-19 18:52:16.600274
THREAD_ID: 0
PRIO: Note
ERROR_CODE: MY-013993
SUBSYSTEM: Server
DATA: Thread pool closed connection id 39 for `admin`@`%` after 28800.004878 seconds of inactivity. Attributes: priority:normal, type:normal, last active:2023-03-19T10:52:16.595189Z, expired:2023-03-19T18:52:16.595199Z (4868 microseconds ago)
*************************** 9. row ***************************
LOGGED: 2023-03-19 18:52:16.600328
THREAD_ID: 0
PRIO: Note
ERROR_CODE: MY-013730
SUBSYSTEM: Server
DATA: 'wait_timeout' period of 28800 seconds was exceeded for `admin`@`%`. The idle time since last command was too long.
*************************** 10. row ***************************
LOGGED: 2023-03-20 13:47:28.843589
THREAD_ID: 365
PRIO: Warning
ERROR_CODE: MY-010055
SUBSYSTEM: Server
DATA: IP address '10.0.1.237' could not be resolved: Name or service not known
10 rows in set (0.0015 sec)
The example above lists the last 10 entries in error log.
It’s possible to get some statistics on the entries in error log much easily then parsing the file with sed and awk:
select subsystem, count(*)
from performance_schema.error_log
group by subsystem order by subsystem;
+-----------+----------+
| subsystem | count(*) |
+-----------+----------+
| Health | 112 |
| InnoDB | 1106 |
| RAPID | 51 |
| Repl | 4 |
| Server | 483 |
+-----------+----------+
5 rows in set (0.0018 sec)
select prio, count(*)
from performance_schema.error_log
group by prio order by prio;
+---------+----------+
| prio | count(*) |
+---------+----------+
| System | 105 |
| Error | 2 |
| Warning | 50 |
| Note | 1599 |
+---------+----------+
4 rows in set (0.0014 sec)
The error log provides a lot of information about how healthy is your system, about health monitor, InnoDB, replication, authentication failures, etc…
For example, we can see the disk usage (see the previous post) in the error_log
table too:
select * from error_log where subsystem="Health"
and data like 'DISK:%' order by logged desc limit 4\G
*************************** 1. row ***************************
LOGGED: 2023-03-19 08:51:09.000200
THREAD_ID: 0
PRIO: Note
ERROR_CODE: MY-013694
SUBSYSTEM: Health
DATA: DISK: mount point='/db', available=84.9G, total=99.9G, used=15.1%,
low limit=4.0G, critical=2.0G, warnings=23.2G/13.6G/8.8G
*************************** 2. row ***************************
LOGGED: 2023-03-17 15:24:57.000133
THREAD_ID: 0
PRIO: Note
ERROR_CODE: MY-013694
SUBSYSTEM: Health
DATA: DISK: mount point='/db', available=84.9G, total=99.9G, used=15.1%,
low limit=4.0G, critical=2.0G, warnings=23.2G/13.6G/8.8G
*************************** 3. row ***************************
LOGGED: 2023-03-16 19:24:57.000122
THREAD_ID: 0
PRIO: Note
ERROR_CODE: MY-013694
SUBSYSTEM: Health
DATA: DISK: mount point='/db', available=74.9G, total=99.9G, used=25.1%,
low limit=4.0G, critical=2.0G, warnings=23.2G/13.6G/8.8G
*************************** 4. row ***************************
LOGGED: 2023-03-16 16:34:57.000175
THREAD_ID: 0
PRIO: Note
ERROR_CODE: MY-013694
SUBSYSTEM: Health
DATA: DISK: mount point='/db', available=46.7G, total=99.9G, used=53.2%,
low limit=4.0G, critical=2.0G, warnings=23.2G/13.6G/8.8G
The log_error_verbosity
is set to 3 in MySQL Database Service, meaning it will log the errors, the warnings and the different information messages.
These are the configuration settings related to the error log in MDS:
select * from performance_schema.global_variables
where variable_name like 'log_error%';
+----------------------------+-------------------------------------------------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+----------------------------+-------------------------------------------------------+
| log_error | /db/log/error.log |
| log_error_services | log_filter_internal; log_sink_internal; log_sink_json |
| log_error_suppression_list | MY-012111 |
| log_error_verbosity | 3 |
+----------------------------+-------------------------------------------------------+
In MySQL Database Service, we can also see that the error MY-012111 is not logged:
show global variables like 'log_error_sup%';
+----------------------------+-----------+
| Variable_name | Value |
+----------------------------+-----------+
| log_error_suppression_list | MY-012111 |
+----------------------------+-----------+
This error is related to MySQL trying to access a missing tablespace:
$ perror MY-012111
MySQL error code MY-012111 (ER_IB_WARN_ACCESSING_NONEXISTINC_SPACE):
Trying to access missing tablespace %lu
However, a user doesn’t have the possibility to change any settings related to the error log, neither using SET GLOBAL
, neither by creating a MDS configuration using the OCI console.
Conclusion
In MDS you don’t have access to the error log file but its content is available in Performance_Schema
and easier to parse using SQL.
It’s a really good source of information that I invite every users to parse regularly.