apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
  namespace: databases
  annotations:
    example: "https://gist.githubusercontent.com/fevangelou/fb72f36bbe333e059b66/raw/5cd672f2a44704b9b2fca8479f0a8d54a42f8529/my.cnf"
data:
  default.cnf: |
    [mysql]
    port                            = 3306
    socket                          = /var/run/mysqld/mysqld.sock

    [mysqld]
    # === Required Settings ===
    basedir                         = /usr
    bind_address                    = 0.0.0.0
    datadir                         = /var/lib/mysql
    max_allowed_packet              = 256M
    max_connect_errors              = 1000000
    pid_file                        = /var/run/mysqld/mysqld.pid
    port                            = 3306
    skip_external_locking
    skip_name_resolve
    socket                          = /var/run/mysqld/mysqld.sock
    tmpdir                          = /tmp
    user                            = mysql

    # === SQL Compatibility Mode ===
    # Enable for b/c with databases created in older MySQL/MariaDB versions
    # (e.g. when using null dates)
    #sql_mode                       = ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES
    # Crappy SQL queries/schema? Go bold!
    #sql_mode                       = ""

    # === InnoDB Settings ===
    default_storage_engine          = InnoDB
    innodb_buffer_pool_instances    = 4       # Use 1 instance per 1GB of InnoDB pool size - max is 64
    innodb_buffer_pool_size         = 500M    # Use up to 70-80% of RAM
    innodb_file_per_table           = 1
    innodb_flush_log_at_trx_commit  = 0
    innodb_flush_method             = O_DIRECT
    innodb_log_buffer_size          = 16M
    innodb_log_file_size            = 1G
    innodb_stats_on_metadata        = 0
    #innodb_use_fdatasync            = 1     # Only (!) for MySQL v8.0.26+

    #innodb_temp_data_file_path     = ibtmp1:64M:autoextend:max:20G # Control the maximum size for the ibtmp1 file
    #innodb_thread_concurrency      = 4     # Optional: Set to the number of CPUs on your system (minus 1 or 2) to better
                                      # contain CPU usage. E.g. if your system has 8 CPUs, try 6 or 7 and check
                                      # the overall load produced by MySQL/MariaDB.
    innodb_read_io_threads          = 64
    innodb_write_io_threads         = 64
    #innodb_io_capacity             = 2000  # Depends on the storage tech - use 2000 for SSD, more for NVMe
    #innodb_io_capacity_max         = 4000  # Usually double the value of innodb_io_capacity

    # === MyISAM Settings ===
    # The following 3 options are ONLY supported by MariaDB & up to MySQL 5.7
    # Do NOT un-comment on MySQL 8.x+
    #query_cache_limit              = 4M    # UPD
    #query_cache_size               = 64M   # UPD
    #query_cache_type               = 1     # Enabled by default

    key_buffer_size                 = 32M   # UPD

    low_priority_updates            = 1
    concurrent_insert               = 2

    # === Connection Settings ===
    max_connections                 = 100   # UPD - Important: high no. of connections = high RAM consumption

    back_log                        = 512
    thread_cache_size               = 100
    thread_stack                    = 192K

    interactive_timeout             = 180
    wait_timeout                    = 180

    # For MySQL 5.7+ only (disabled by default)
    #max_execution_time             = 90000 # Set a timeout limit for SELECT statements (value in milliseconds).
                                      # This option may be useful to address aggressive crawling on large sites,
                                      # but it can also cause issues (e.g. with backups). So use with extreme caution and test!
                                      # More info at: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_execution_time

    # For MariaDB 10.1.1+ only (disabled by default)
    #max_statement_time             = 90    # The equivalent of "max_execution_time" in MySQL 5.7+ (set above)
                                      # The variable is of type double, thus you can use subsecond timeout.
                                      # For example you can use value 0.01 for 10 milliseconds timeout.
                                      # More info at: https://mariadb.com/kb/en/aborting-statements/

    # === Buffer Settings ===
    innodb_sort_buffer_size         = 2M    # UPD
    join_buffer_size                = 4M    # UPD
    read_buffer_size                = 3M    # UPD
    read_rnd_buffer_size            = 4M    # UPD
    sort_buffer_size                = 4M    # UPD

    # === Table Settings ===
    # In systemd managed systems like Ubuntu 16.04+ or CentOS 7+, you need to perform an extra action for table_open_cache & open_files_limit
    # to be overriden (also see comment next to open_files_limit).
    # E.g. for MySQL 5.7, please check: https://dev.mysql.com/doc/refman/5.7/en/using-systemd.html
    # and for MariaDB check: https://mariadb.com/kb/en/library/systemd/
    table_definition_cache          = 40000 # UPD
    table_open_cache                = 40000 # UPD
    open_files_limit                = 60000 # UPD - This can be 2x to 3x the table_open_cache value or match the system's
                                      # open files limit usually set in /etc/sysctl.conf or /etc/security/limits.conf
                                      # In systemd managed systems this limit must also be set in:
                                      # /etc/systemd/system/mysqld.service.d/override.conf (for MySQL 5.7+) and
                                      # /etc/systemd/system/mariadb.service.d/override.conf (for MariaDB)

    max_heap_table_size             = 128M  # Increase to 256M or 512M if you have lots of temporary tables because of missing indices in JOINs
    tmp_table_size                  = 128M  # Use same value as max_heap_table_size

    # === Search Settings ===
    ft_min_word_len                 = 3     # Minimum length of words to be indexed for search results

    # === Logging ===
    # Note: Binary logging is enabled by default
    #       Disable entirely or otherwise configure in the following settings

    #skip_log_bin                           # Disable bin log entirely
    #expire_logs_days               = 1     # Keep logs for 1 day - Deprecated in MySQL 8+
    #binlog_expire_logs_seconds     = 86400 # Keep logs for 1 day - Use on MySQL 8+ only (!)

    log_error                       = /var/lib/mysql/mysql_error.log

    log_queries_not_using_indexes   = 0     # Disabled on production
    long_query_time                 = 5
    slow_query_log                  = 0     # Disabled on production
    slow_query_log_file             = /var/lib/mysql/mysql_slow.log

    [mysqldump]
    # Variable reference
    # For MySQL 5.7+:  https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
    # For MariaDB:     https://mariadb.com/kb/en/library/mysqldump/
    quick
    quote_names
    max_allowed_packet              = 1024M
