近期 MySQL 总结binlog-format=row 的应用场景和mysql shutdown

1 row 的应用场景

数据中心的核心库压力过大,所以从原来的数据中心服务提出来,做成单独的数据服务器,然后其他业务通过mysql replication 复制这个库,此时出现了一个问题,这个核心服务上有些sql是跨库操作,而其他业务库都有自己的一系列数据库,这些库的数据都不一样,只有核心库的数据是一致,所以只能使用row模式,单独复制核心数据库.

2 mysql shutdown

当我们使用

mysqladmin -uuser -ppassword shutdown -S/tmp/mysql.sock

mysqladmin -uuser -ppassword shutdown -hip

关机的时候 两者是不同的,前者会等待mysqld关闭才返回关闭信号,后者不会,直接就返回关闭信号,而这时mysqld进程多半在进程树中 cpu 100%或者I/O 100%在哪里处理脏页.

此时不能关机,应当判断mysql进程真的关闭后才能关闭linux系统.

3 binlog error

Could not use /mysql5/bin-log for logging (error 2). Turning logging off for the whole duration of the MySQL server process. To turn it on again: fix the cause, shutdown the MySQL server and restart it.

出现这种问题一般分为两种情况

第一种:用户的权限不够,或者开启了SElinux,无法执行创建打开或者写入操作.

第二种:磁盘健康问题.

不过最近遇到了特例,mysql启动竟然放在了linux加载硬盘的前面,造成了binlog文件创建失败...不过这也应该算作第三种情况.

一键安装mysql脚本#!/bin/bash# # 要用root用户 ## #获取本机的ip地址,然后将这个ip地址设置为环境变量ipaddr的值 export ipaddr=`ip a | grep -w inet | grep -v 127| awk '{ print $2 }' |awk -F '/' '{print $1}'` #将本机的ip地址的第三第四位合在一起,然后赋予给环境变量serverid,加入本机ip为10.192.168.178,那么serverid=168178 export serverid=`echo $ipaddr | awk -F '.' '{print $3$4}'` #以下这一段是为了求得机器的内存是多少。dmidecode -t 17是获取系统内存相关信息,并把这个值赋予给MEM_SIZE这个环境变量 export UNIT=`dmidecode -t 17|grep -i size |grep -i GB|wc -l` if [[ $UNIT -eq 0 ]]; then export MEM_SIZE=`dmidecode -t 17|grep -i size |grep -v 'No'|awk '{sum+=$2;}END{print sum;}'` else export SIZE=`dmidecode -t 17|grep -i size |grep -v 'No'|awk '{sum+=$2;}END{print sum;}'` export MEM_SIZE=$(($SIZE*1024)) fi # 物理内存等于虚拟内存除以2,并把这个值赋予给buffer这个环境变量 export buffer=$(($MEM_SIZE/2)) # 密码需要修改 export pwd=yourpassword export rplpwd=yourpassword #统计一下 系统中装有mariadb-libs的数量 mariadbcheck=`rpm -qa|grep mariadb-libs|wc -l` #如果统计值后发现mariadb-libs的数量等于1,说明系统里装了mariadb-libs,那么我就要用yum remove删除他 if [[ $mariadbcheck -eq 1 ]]; then yum remove -y mariadb-libs fi #解压/opt 目录下的 mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz 文件,并将解压过程中的输出信息重定向到 /dev/null ,这意味着不会在终端显示解压的详细过程输出。 #tar 是用于打包解包文件的命令。-J 表示使用 xz 格式进行解压缩。-x 表示解包。-v 表示显示详细信息。-f 后跟要操作的文件。 tar -Jxvf /opt/mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz >/dev/null mv /opt/mysql-8.0.13-linux-glibc2.12-x86_64/* /usr/local/mysql/ chown -R mysql:mysql /usr/local/mysql/ cp /usr/local/mysql/bin/* /usr/bin/ #检查是否存在/etc/my.cnf个文件,如果存在那么就以当天日期重命名这个文件然后备份为bak,例如my.cnf.20240905140424.bak if [ -s /etc/my.cnf ]; then mv /etc/my.cnf /etc/my.cnf.`date +%Y%m%d%H%M%S`.bak fi #创建一个新的/etc/my.cnf文件,然后将以下内容写进去,直至遇到EOF这个标识符,EOF之后的内容就别写进去了 cat >/etc/my.cnf <<EOF [mysqld] read_only = 0 show_compatibility_56 = 1 port = 3306 server_id = $serverid user = mysql basedir = /usr/local/mysql datadir = /vdb/mysql/data socket = /vdb/mysql/tmp/mysql.sock tmpdir = /vdb/mysql/tmp character_set_server = utf8mb4 transaction_isolation = READ-COMMITTED event_scheduler = 1 default-time-zone = "+8:00" log_timestamps = SYSTEM explicit_defaults_for_timestamp = 1 secure_file_priv = "" skip_slave_start = 1 skip_name_resolve = 1 skip_external_locking = 1 lower_case_table_names = 1 default_storage_engine = InnoDB disabled_storage_engines = ARCHIVE,BLACKHOLE,EXAMPLE,FEDERATED,MEMORY,MERGE,NDB # connection # lock_wait_timeout = 1800 max_connections = 3000 max_connect_errors = 1000000 interactive_timeout = 1800 wait_timeout = 1800 # session memory setting # read_buffer_size = 8M read_rnd_buffer_size = 8M sort_buffer_size = 2M tmp_table_size = 64M join_buffer_size = 64M max_heap_table_size = 64M max_allowed_packet = 64M # cache config # key_buffer_size = 16M table_definition_cache = 2000 table_open_cache = 2000 table_open_cache_instances = 8 query_cache_type = 0 query_cache_size = 0 thread_cache_size = 200 open_files_limit = 65536 binlog_cache_size = 1M max_binlog_cache_size = 512M # log config # log_bin = /vdb/mysql/binlog/mysql-bin binlog_format = row sync_binlog = 1 binlog_error_action = ABORT_SERVER max_binlog_size = 250M binlog_rows_query_log_events = 1 expire_logs_days = 7 log_bin_trust_function_creators = 1 log_slave_updates = 1 relay_log = /vdb/mysql/binlog/mysql-relay relay_log_recovery = 1 master_info_repository = TABLE relay_log_info_repository = TABLE log_error = /vdb/mysql/logs/error.log slow_query_log = 1 slow_query_log_file = /vdb/mysql/logs/slow.log long_query_time = 5 log_queries_not_using_indexes = 1 log_slow_admin_statements = 1 log_slow_slave_statements = 1 log_throttle_queries_not_using_indexes = 10 min_examined_row_limit = 100 # innodb settings # innodb_data_home_dir = /vdb/mysql/data innodb_log_group_home_dir = /vdb/mysql/data innodb_file_per_table = 1 innodb_data_file_path = ibdata1:1G:autoextend innodb_flush_log_at_trx_commit = 1 innodb_buffer_pool_size = ${buffer}M innodb_buffer_pool_instances = 8 innodb_buffer_pool_load_at_startup = 1 innodb_buffer_pool_dump_at_shutdown = 1 innodb_buffer_pool_dump_pct = 25 innodb_lock_wait_timeout = 10 innodb_io_capacity = 10000 innodb_io_capacity_max = 20000 innodb_max_dirty_pages_pct = 60 innodb_flush_method = O_DIRECT innodb_log_file_size = 2G innodb_log_files_in_group = 2 innodb_log_buffer_size = 64M innodb_purge_threads = 2 innodb_write_io_threads = 16 innodb_read_io_threads = 16 innodb_large_prefix = 1 innodb_thread_concurrency = 64 innodb_print_all_deadlocks = 1 innodb_strict_mode = 1 innodb_sort_buffer_size = 32M innodb_stats_persistent_sample_pages = 64 innodb_autoinc_lock_mode = 2 innodb_online_alter_log_max_size = 1G innodb_open_files = 4096 innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:20G # undo config # innodb_rollback_segments = 128 innodb_undo_log_truncate = 1 innodb_max_undo_log_size = 4G # GTID # gtid_mode = ON enforce_gtid_consistency = 1 binlog_gtid_simple_recovery = 1 # MTS # slave_parallel_type = LOGICAL_CLOCK slave_parallel_workers = 16 slave_preserve_commit_order = ON slave_rows_search_algorithms = 'INDEX_SCAN,HASH_SCAN' # SEMISYNC # plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl_semi_sync_master_enabled = 1 rpl_semi_sync_slave_enabled = 1 rpl_semi_sync_master_timeout = 60000 #1min rpl_semi_sync_master_wait_for_slave_count = 1 rpl_semi_sync_master_wait_no_slave = 0 # Performance Schema Config # performance-schema-instrument = 'wait/lock/metadata/sql/mdl=ON' performance-schema-instrument = 'memory/%=COUNTED' # Other # innodb_numa_interleave = 1 [mysqldump] quick max_allowed_packet = 2G log-error = /vdb/mysql/logs/dump.log net_buffer_length = 8K [mysqladmin] default-character-set = utf8mb4 socket = /vdb/mysql/tmp/mysql.sock [client] port = 3306 socket = /vdb/mysql/tmp/mysql.sock [mysql] prompt = [\\u@\\h][\\d]:\\_ default-character-set = utf8mb4 no-auto-rehash EOF #这里用的是>>,是追加新内容到/root/.bash_profile,并不是全覆盖。 #然后将以下内容写进去,直至遇到EOF这个标识符,EOF之后的内容就别写进去了 cat >>/root/.bash_profile <<EOF export PATH=/usr/local/mysql/bin:\$PATH EOF 刷新/root/.bash_profile这个文件并使之生效 source /root/.bash_profile #这段命令用于启动 MySQL 服务器,并指定了一些重要的参数: #/usr/local/mysql/bin/mysqld这个是mysql的启动项,相当于windows桌面上的启动图标双击一下就运行该软件了 # --defaults-file=/etc/my.cnf:指定了配置文件的路径。 #--user=mysql:指定以 mysql 用户身份运行服务器。 #--datadir=/vdb/mysql/data:指定数据存储的目录。 #--basedir=/usr/local/mysql:指定 MySQL 的安装目录。 #--initialize-insecure:执行不安全的初始化,这可能意味着设置一些默认的、不太严格的安全选项来快速初始化数据库。 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --user=mysql --datadir=/vdb/mysql/data --basedir=/usr/local/mysql --initialize-insecure #把/usr/local/mysql/support-files/mysql.server复制到/etc/init.d/这个文件夹里面去,取名为mysqld #/etc/init.d/ 文件夹通常用于存放系统服务守护进程的启动、停止、重启等操作的脚本。 #也就是说我们这样手动安装的软件mysql,以后也可以用systemctl start mysql这样的命令来启动mysql了比较方便。 # /usr/local/mysql/support-files/mysql.server这个文件其实就是一个程序脚本,你看路径名里都有一个support-files #就是为了方便后续用户可以添加到linux系统里面的快捷启动方式里面(systemctl)。 #但是上面那个/usr/local/mysql/bin/mysqld是mysql的启动文件,这个不是一个脚本,用vim是打不开的,看不到里有啥内容 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld #赋予/etc/init.d/mysqld具有可执行的权限 chmod 755 /etc/init.d/mysqld #将名为 mysqld 的服务添加到系统的服务管理配置中,方便可以用systemctl来控制启动、停止等状态 chkconfig --add mysqld #设置 MySQL 服务(mysqld)在运行级别 2、3、4、5 中为开机自启动(on)状态。 #运行级别是系统在不同模式下的运行状态,例如,2 通常是多用户模式但没有网络,3 是多用户模式带网络,4 通常未被使用,5 是带有图形界面的多用户模式。 chkconfig --level 2345 mysqld on #将”/usr/local/mysql/lib“写入到/etc/ld.so.conf.d/mysql-x86_64.conf里面去 cat >> /etc/ld.so.conf.d/mysql-x86_64.conf<<EOF /usr/local/mysql/lib EOF #刷新系统的共享库缓存,以便程序能够正确找到加载所需的共享库 ldconfig #用于检查/proc/vz是否为一个目录,条件为真,就会执行then后面的语句 #ulimit -s unlimited 这条命令用于设置栈大小(stack size)为无限制(unlimited)。 #在某些情况下,如果程序需要较大的栈空间来处理复杂的操作或递归调用,可能会使用这条命令来避免栈空间不足导致的错误。 if [ -d "/proc/vz" ]; then ulimit -s unlimited fi #使用systemctl来启动mysql systemctl start mysqld.service # 创建监控用户,只读用户,复制用户 /usr/local/mysql/bin/mysqladmin -u root password $pwd > /dev/dull #把这两句SQL语句写入到/tmp/mysql_sec_scripts里面去 #这段 SQL 语句的作用是授予用户 'repl_user'@'%' 复制从服务器的权限。 #*.* 表示在所有数据库所有表上授予权限。 #identified by '$rplpwd' 表示设置该用户的密码为 $rplpwd 变量所代表的值。 #flush privileges是刷新授权表; cat > /tmp/mysql_sec_scripts<<EOF grant replication slave on *.* to 'repl_user'@'%' identified by '$rplpwd'; flush privileges; EOF # 使用 /usr/local/mysql/bin/mysql 这个 MySQL 客户端程序, #以 root 用户身份,密码由 $pwd 变量指定,连接到本地主机(localhost)上的 MySQL 服务器 #并执行 /tmp/mysql_sec_scripts 文件中的 SQL 语句 # /usr/local/mysql/bin/mysql刚才上面提到的/usr/local/mysql/bin/mysqld是不太一样的 # mysql是客户端程序,mysqld是主程序,主程序是运行在背后,但是我们人类想看mysql数据库里面的各种数据库具体表格 #就需要用到mysql客户端了,用mysql客户端连接背后的数据库用SQL语句进行相关的增删改查交互操作 /usr/local/mysql/bin/mysql -u root -p$pwd -h localhost </tmp/mysql_sec_scripts #删除/tmp/mysql_sec_scripts rm -f /tmp/mysql_sec_scripts #检查MySQL主程序有没有运行,在运行就赋值mcheck为1,否则为0 mcheck=`systemctl status mysqld.service|grep 'active (running)'|wc -l` #如果/usr/local/mysql/bin/mysql存在,并且/usr/local/mysql/bin/mysqld_safe也存在, #并且/etc/my.cnf也存在,并且MySQL主程序在运行中 #那么输出MySQL 5.7 install completed,以及MySQL网络连接状态信息,不然就输出安装失败Failed #ss -anutlp | grep 3306就是使用 ss 命令查看所有的网络连接状态信息; #(包括套接字的类型、状态、本地地址端口、远程地址端口等),然后通过 grep 3306 筛选出与端口 3306 相关的连接信息。 if [ -s /usr/local/mysql/bin/mysql ] && [ -s /usr/local/mysql/bin/mysqld_safe ] && [ -s /etc/my.cnf ] && [ $mcheck -eq 1 ]; then echo "" echo "MySQL 5.7 install completed" ss -anutlp | grep 3306 else echo "Error: MySQL Install Failed!!" fi
08-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值