Ldap users import not working with mariadb

Ldap users import not working with mariadb

by Benoit LORAND -
Number of replies: 10

hi,

I have built a new moodle server and i'm encoutering problem with the ldap import (new database).

My installation is as this :

   - Debian 9

   - Mariadb 10.2 (also tried with 10.3)

   - Moodle-33

   - An Active Directory server


When i tried with another SQL server (MySQL), my configuration is working well.

But if i use mariadb as sql server, i obtain this :


php /opt/moodle/admin/tool/task/cli/schedule_task.php --execute='\auth_ldap\task\sync_task'

Execute scheduled task: Tâche de synchronisation pour utilisateurs LDAP (auth_ldap\task\sync_task)

Connection au serveur LDAP...Création de la table temporaire tmp_extuser... used 5 dbqueries

... used 0.033057928085327 seconds

Scheduled task failed: Tâche de synchronisation pour utilisateurs LDAP (auth_ldap\task\sync_task),Erreur d'exécution DDL sql

Debug info:

CREATE TEMPORARY TABLE is not allowed with ROW_FORMAT=COMPRESSED or KEY_BLOCK_SIZE.

CREATE TEMPORARY TABLE mdl_tmp_extuser (

    id BIGINT(10) NOT NULL auto_increment,

    username VARCHAR(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',

    mnethostid BIGINT(10) NOT NULL,

CONSTRAINT  PRIMARY KEY (id)

) DEFAULT COLLATE utf8mb4_unicode_ci ROW_FORMAT=Compressed

;

CREATE UNIQUE INDEX mdl_tmpextu_mneuse_uix ON mdl_tmp_extuser (mnethostid, username)

Backtrace:

* line 1000 of /lib/dml/mysqli_native_moodle_database.php: call to moodle_database->query_end()

* line 77 of /lib/ddl/database_manager.php: call to mysqli_native_moodle_database->change_database_structure()

* line 467 of /lib/ddl/database_manager.php: call to database_manager->execute_sql_arr()

* line 684 of /auth/ldap/auth.php: call to database_manager->create_temp_table()

* line 50 of /auth/ldap/classes/task/sync_task.php: call to auth_plugin_ldap->sync_users()

* line 146 of /admin/tool/task/cli/schedule_task.php: call to auth_ldap\task\sync_task->execute()


Potential coding error - existing temptables found when disposing database. Must be dropped!

PHP Fatal error:  Uncaught ddl_change_structure_exception: Erreur d'exécution DDL sql in /opt/moodle/lib/dml/moodle_database.php:492

Stack trace:

#0 /opt/moodle/lib/dml/mysqli_native_moodle_database.php(1000): moodle_database->query_end(false)

#1 /opt/moodle/lib/ddl/database_manager.php(77): mysqli_native_moodle_database->change_database_structure('DROP TEMPORARY ...', Array)

#2 /opt/moodle/lib/ddl/database_manager.php(332): database_manager->execute_sql_arr(Array, Array)

#3 /opt/moodle/lib/dml/moodle_temptables.php(140): database_manager->drop_table(Object(xmldb_table))

#4 /opt/moodle/lib/dml/moodle_database.php(405): moodle_temptables->dispose()

#5 /opt/moodle/lib/dml/mysqli_native_moodle_database.php(565): moodle_database->dispose()

#6 /opt/moodle/lib/dml/moodle_database.php(160): mysqli_native_moodle_database->dispose()

#7 [internal function]: moodle_database->__destruct()

#8 {main}

  thrown in /opt/moodle/lib/dml/moodle_database.php on line 492


Is someone could help me to correct this ?

Average of ratings: -
In reply to Benoit LORAND

Re: Ldap users import not working with mariadb

by Howard Miller -
Picture of Core developers Picture of Documentation writers Picture of Particularly helpful Moodlers Picture of Peer reviewers Picture of Plugin developers

Have you definitely selected 'mariadb' (not mysqli) as the database type in your config.php?

In reply to Benoit LORAND

Re: Ldap users import not working with mariadb

by Ken Task -
Picture of Particularly helpful Moodlers

Both MySQL and MariaDB use /etc/my.cnf, but doesn't MariaDB have an /etc/my.cnf.d directory from which it reads specific settings for either client or server?
The last line of the /etc/my.cnf file shows what other .cnf files to load use and directory to load from.

Might compare my.cnf from the MySQL with the my.cnf (and other files that load) in MariaDB.

'spirit of sharing', Ken


In reply to Ken Task

Re: Ldap users import not working with mariadb

by Baptiste Desprez -
Picture of Plugin developers

I have exactly the same problem.

I think the response is here : https://jira.mariadb.org/browse/MDEV-11816

I am searching for a solution.


In reply to Ken Task

Re: Ldap users import not working with mariadb

by Benoit LORAND -

Hi,

Here the default MardiaDB config.


# cat my.cnf conf.d/* mariadb.conf.d/*

# MariaDB database server configuration file.

#

# You can copy this file to one of:

# - "/etc/mysql/my.cnf" to set global options,

# - "~/.my.cnf" to set user-specific options.

#

# One can use all long options that the program supports.

# Run program with --help to get a list of available options and with

# --print-defaults to see which it would actually understand and use.

#

# For explanations see

# http://dev.mysql.com/doc/mysql/en/server-system-variables.html


# This will be passed to all mysql clients

# It has been reported that passwords should be enclosed with ticks/quotes

# escpecially if they contain "#" chars...

# Remember to edit /etc/mysql/debian.cnf when changing the socket location.

[client]

port            = 3306

socket          = /var/run/mysqld/mysqld.sock


# Here is entries for some specific programs

# The following values assume you have at least 32M ram


# This was formally known as [safe_mysqld]. Both versions are currently parsed.

[mysqld_safe]

socket          = /var/run/mysqld/mysqld.sock

nice            = 0


[mysqld]

#

# * Basic Settings

#

user            = mysql

pid-file        = /var/run/mysqld/mysqld.pid

socket          = /var/run/mysqld/mysqld.sock

port            = 3306

basedir         = /usr

datadir         = /var/lib/mysql

tmpdir          = /tmp

lc_messages_dir = /usr/share/mysql

lc_messages     = en_US

skip-external-locking

#

# Instead of skip-networking the default is now to listen only on

# localhost which is more compatible and is not less secure.

bind-address            = 127.0.0.1

#

# * Fine Tuning

#

max_connections         = 100

connect_timeout         = 5

wait_timeout            = 600

max_allowed_packet      = 16M

thread_cache_size       = 128

sort_buffer_size        = 4M

bulk_insert_buffer_size = 16M

tmp_table_size          = 32M

max_heap_table_size     = 32M

#

# * MyISAM

#

# This replaces the startup script and checks MyISAM tables if needed

# the first time they are touched. On error, make copy and try a repair.

myisam_recover_options = BACKUP

key_buffer_size         = 128M

#open-files-limit       = 2000

table_open_cache        = 400

myisam_sort_buffer_size = 512M

concurrent_insert       = 2

read_buffer_size        = 2M

read_rnd_buffer_size    = 1M

#

# * Query Cache Configuration

#

# Cache only tiny result sets, so we can fit more in the query cache.

query_cache_limit               = 128K

query_cache_size                = 64M

# for more write intensive setups, set to DEMAND or OFF

#query_cache_type               = DEMAND

#

# * Logging and Replication

#

# Both location gets rotated by the cronjob.

# Be aware that this log type is a performance killer.

# As of 5.1 you can enable the log at runtime!

#general_log_file        = /var/log/mysql/mysql.log

#general_log             = 1

#

# Error logging goes to syslog due to /etc/mysql/conf.d/mysqld_safe_syslog.cnf.

#

# we do want to know about network errors and such

log_warnings            = 2

#

# Enable the slow query log to see queries with especially long duration

#slow_query_log[={0|1}]

slow_query_log_file     = /var/log/mysql/mariadb-slow.log

long_query_time = 10

#log_slow_rate_limit    = 1000

log_slow_verbosity      = query_plan


#log-queries-not-using-indexes

#log_slow_admin_statements

#

# The following can be used as easy to replay backup logs or for replication.

# note: if you are setting up a replication slave, see README.Debian about

#       other settings you may need to change.

#server-id              = 1

#report_host            = master1

#auto_increment_increment = 2

#auto_increment_offset  = 1

log_bin                 = /var/log/mysql/mariadb-bin

log_bin_index           = /var/log/mysql/mariadb-bin.index

# not fab for performance, but safer

#sync_binlog            = 1

expire_logs_days        = 10

max_binlog_size         = 100M

# slaves

#relay_log              = /var/log/mysql/relay-bin

#relay_log_index        = /var/log/mysql/relay-bin.index

#relay_log_info_file    = /var/log/mysql/relay-bin.info

#log_slave_updates

#read_only

#

# If applications support it, this stricter sql_mode prevents some

# mistakes like inserting invalid dates etc.

#sql_mode               = NO_ENGINE_SUBSTITUTION,TRADITIONAL

#

# * InnoDB

#

# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.

# Read the manual for more InnoDB related options. There are many!

default_storage_engine  = InnoDB

# you can't just change log file size, requires special procedure

#innodb_log_file_size   = 50M

innodb_buffer_pool_size = 256M

innodb_log_buffer_size  = 8M

innodb_file_per_table   = 1

innodb_open_files       = 400

innodb_io_capacity      = 400

innodb_flush_method     = O_DIRECT

#

# * Security Features

#

# Read the manual, too, if you want chroot!

# chroot = /var/lib/mysql/

#

# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".

#

# ssl-ca=/etc/mysql/cacert.pem

# ssl-cert=/etc/mysql/server-cert.pem

# ssl-key=/etc/mysql/server-key.pem


#

# * Galera-related settings

#

[galera]

# Mandatory settings

#wsrep_on=ON

#wsrep_provider=

#wsrep_cluster_address=

#binlog_format=row

#default_storage_engine=InnoDB

#innodb_autoinc_lock_mode=2

#

# Allow server to accept connections on all interfaces.

#

#bind-address=0.0.0.0

#

# Optional setting

#wsrep_slave_threads=1

#innodb_flush_log_at_trx_commit=0


[mysqldump]

quick

quote-names

max_allowed_packet      = 16M


[mysql]

#no-auto-rehash # faster start of mysql but no tab completion


[isamchk]

key_buffer              = 16M


#

# * IMPORTANT: Additional settings that can override those from this file!

#   The files must end with '.cnf', otherwise they'll be ignored.

#

!includedir /etc/mysql/conf.d/

# MariaDB-specific config file.

# Read by /etc/mysql/my.cnf


[client]

# Default is Latin1, if you need UTF-8 set this (also in server section)

#default-character-set = utf8


[mysqld]

#

# * Character sets

#

# Default is Latin1, if you need UTF-8 set all this (also in client section)

#

#character-set-server  = utf8

#collation-server      = utf8_general_ci

#character_set_server   = utf8

#collation_server       = utf8_general_ci

# Import all .cnf files from configuration directory

!includedir /etc/mysql/mariadb.conf.d/

[mysqld_safe]

skip_log_error

syslog

In reply to Benoit LORAND

Re: Ldap users import not working with mariadb

by Benoit LORAND -

Is it possible that's "binlog_format = ROW" parameter ?


See : https://docs.moodle.org/33/en/MariaDB


Best regards,

Benoit

In reply to Benoit LORAND

Re: Ldap users import not working with mariadb

by Baptiste Desprez -
Picture of Plugin developers

I have done a bug report in https://tracker.moodle.org/browse/MDL-59476, wait and see !

In reply to Baptiste Desprez

Re: Ldap users import not working with mariadb

by Benoit LORAND -

It works for me with the patch.

Thanks all

Best regards,

Benoit LORAND

In reply to Benoit LORAND

Re: Ldap users import not working with mariadb

by Ken Task -
Picture of Particularly helpful Moodlers

Can't tell by this posting what file is being read from where.

cat my.cnf conf.d/* mariadb.conf.d/*

In MariaDB config, last line is:

!includedir /etc/mysql/mariadb.conf.d/

so whatever is in /etc/mysql/mariadb.conf.d/ will be loaded.

So whatever .cnf files are in the above (like client.cnf, server.cnf) are in the diretory above would also be loaded ... or it would attempt to load them.    Could have a conflict ... one file sets a value then the next file it tries to load sets that same value to something lower/higher or null.

For server.cnf the section labeled:

[mysqld]

are settings for the daemon ... server ... service.

IF the DB is not on same physical server, one might have to tweak client.cnf.

'spirit of sharing', Ken