在binlog_format格式为row或者mixed的情况下,mysql主从同步结构下,从库上的触发器对于来自于主从复制的记录变更不会再次触发触发器。但是,在mariadb中,却可以实现这个功能的,mariadb拥有一个全局参数slave_run_triggers_for_rbr,当设置为1时,即开启从库对triggers的触发。
案例:
业务数据库使用MySQL双主架构,MySQL版本:5.7.15-log,根据业务需要,现需对数据库中部分表添加触发器,将数据变更实时同步到redis中(通过UDF实现),因为UDF需额外编译扩展,不适合放到双主服务器上,所以对其中一台主做一台从,通过主从复制,在第三台数据库服务器上实现数据变更到redis的同步。但是,经过实际测试,发现MySQL主从同步的数据不能够触发触发器(binlog_format格式为statement时,从库可以触发),因为线上使用的是mixed格式,所以不能实现。现使用MariaDB,版本10.3.9(mariadb-10.3.9-linux-systemd-x86_64),开启slave_run_triggers_for_rbr,实现触发。
测试版本
Master:MySQL 5.7.15-log
Slave:MariaDB 10.3.9 (mariadb-10.3.9-linux-systemd-x86_64)
参数差异
在实际操作过程中,发现,部分配置参数仅MySQL支持,MariaDB不支持,部分配置参数仅MariaDB支持,MySQL不支持,这里整理如下:
log_timestamps=SYSTEM
master_info_repository = TABLE
relay_log_info_repository = TABLE
gtid_mode = off
enforce_gtid_consistency = 0
internal_tmp_disk_storage_engine = InnoDB
MySQL不支持的配置
slave_run_triggers_for_rbr = 1
MariaDB替换MySQL
MariaDB的初始化
./mysql_install_db --no-defaults --basedir=/opt/mariadb-10.3.9-linux-systemd-x86_64 --datadir=/data/mysql
To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system
PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !
To do so, start the server, then issue the following commands:
'/opt/mariadb-10.3.9-linux-systemd-x86_64/bin/mysqladmin' -u root password 'new-password'
'/opt/mariadb-10.3.9-linux-systemd-x86_64/bin/mysqladmin' -u root -h 192.168.1.10 password 'new-password'
Alternatively you can run:
'/opt/mariadb-10.3.9-linux-systemd-x86_64/bin/mysql_secure_installation'
which will also give you the option of removing the test
databases and anonymous user created by default. This is
strongly recommended for production servers.
See the MariaDB Knowledgebase at http://mariadb.com/kb or the
MySQL manual for more instructions.
You can start the MariaDB daemon with:
cd '/opt/mariadb-10.3.9-linux-systemd-x86_64' ; /opt/mariadb-10.3.9-linux-systemd-x86_64/bin/mysqld_safe --datadir='/data/mysql'
You can test the MariaDB daemon with mysql-test-run.pl
cd '/opt/mariadb-10.3.9-linux-systemd-x86_64/mysql-test' ; perl mysql-test-run.pl
升级步骤
xtrabackup --defaults-file=/etc/my.cnf --no-timestamp --user=root --password=**** --host=192.168.1.11 --target-dir=/data/backup --backup
2、准备数据
xtrabackup --target-dir=/data/backup --prepare
3、将数据复制到/data/mysql目录
4、启动MariaDB
/opt/mysql_server/mysql2/bin/mysqld_safe --defaults-file=/etc/my.cnf &
5、升级,修复部分表差异
./mysql_upgrade -uroot -p*** -h 192.168.1.10 -P 3306
配置文件
低功耗版本/etc/my.cnf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
[client] port = 3306 socket = /data/mysql/mysql.sock [mysql] prompt = "\u@db \R:\m:\s [\d]> " no-auto-rehash [mysqld] user = mysql port = 3306 server-id = 33 basedir = /opt/mysql_server/mysql datadir = /data/mysql socket = /data/mysql/mysql.sock pid-file=/data/mysql/mysqld.pid ##log_timestamps=SYSTEM character-set-server = utf8 skip_name_resolve = 1 open_files_limit = 65535 back_log = 1024 max_connections = 512 max_connect_errors = 1000000 table_open_cache = 1024 table_definition_cache = 1024 table_open_cache_instances = 64 thread_stack = 512K external-locking = FALSE max_allowed_packet = 32M sort_buffer_size = 4M join_buffer_size = 4M thread_cache_size = 768 query_cache_size = 0 query_cache_type = 0 interactive_timeout = 600 wait_timeout = 600 tmp_table_size = 32M max_heap_table_size = 32M slow_query_log = 1 slow_query_log_file = /data/mysql/slow.log log-error = /data/mysql/error.log long_query_time = 0.5 binlog_format = row log-bin = /data/mysql/mysql-binlog sync_binlog = 1 binlog_cache_size = 4M max_binlog_cache_size = 64M max_binlog_size = 256M expire_logs_days = 3 ##master_info_repository = TABLE ##relay_log_info_repository = TABLE ### ##gtid_mode = off ##enforce_gtid_consistency = 0 ###only mariadb slave_run_triggers_for_rbr = 1 log_bin_trust_function_creators = 1 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES log_slave_updates=on relay_log_recovery = 1 relay-log-purge = 1 key_buffer_size = 32M read_buffer_size = 8M read_rnd_buffer_size = 4M bulk_insert_buffer_size = 32M lock_wait_timeout = 3600 explicit_defaults_for_timestamp = 1 innodb_thread_concurrency = 0 innodb_sync_spin_loops = 100 innodb_spin_wait_delay = 30 transaction_isolation = REPEATABLE-READ innodb_buffer_pool_size = 2G innodb_buffer_pool_instances = 8 innodb_buffer_pool_load_at_startup = 1 innodb_buffer_pool_dump_at_shutdown = 1 innodb_data_file_path = ibdata1:12M;ibdata2:16M:autoextend innodb_flush_log_at_trx_commit = 1 innodb_log_buffer_size = 32M innodb_log_file_size = 128M innodb_log_files_in_group = 4 innodb_io_capacity = 2000 innodb_io_capacity_max = 4000 innodb_flush_neighbors = 0 innodb_write_io_threads = 8 innodb_read_io_threads = 8 innodb_purge_threads = 4 innodb_page_cleaners = 4 innodb_open_files = 65535 innodb_max_dirty_pages_pct = 50 innodb_flush_method = O_DIRECT innodb_lru_scan_depth = 4000 innodb_checksum_algorithm = crc32 innodb_lock_wait_timeout = 10 innodb_rollback_on_timeout = 1 innodb_print_all_deadlocks = 1 innodb_file_per_table = 1 innodb_online_alter_log_max_size = 512M ##internal_tmp_disk_storage_engine = InnoDB innodb_stats_on_metadata = 0 innodb_status_file = 1 innodb_status_output = 0 innodb_status_output_locks = 0 performance_schema = 1 performance_schema_instrument = '%=on' [mysqldump] quick max_allowed_packet = 32M |