MariaDB/MySQL~4G数据库配置

本文介绍如何优化MariaDB/MySQL配置文件my.cnf,包括参数调整建议,以提升数据库性能。适用于生产环境,针对不同硬件环境和数据量进行个性化配置。

MariaDB/MySQL配置文件my.cnf解读
MariaDB/MySQL的默认设置性能非常差,仅仅起一个功能测试的作用,不能用在生产环境中,因此要对一些参数进行调整优化。当然,对配置文件各参数的调整需要根据实际环境,不同时期不同数量级的数据进行性能优化。
MySQL/MariaDB 配置文件位于 /etc/my.cnf。 每次更改此文件后需要重启 MySQL 服务,以使更改生效。本文的参数配置基于MariaDB 10.2,硬件内存4G。文中一些选项值的设置只是推荐值,不要盲目的接受这些建议。每个 MySQL 设置都是不同的,在进行任何更改之前需要慎重考虑。

[client]客户端服务端基本配置
port = 3306#客户端默认连接端口
socket = /tmp/mysql.sock#用于本地连接的socket套接字

[mysqld]# 服务端基本配置
port = 3306# mysql监听端口
socket = /tmp/mysql.sock#为MySQL客户端程序和服务器之间的本地通讯指定一个套接字文件
user = mariadb# mysql启动用户
basedir = /usr/local/mariadb# 安装目录
datadir = /data/mysql# 数据库数据文件存放目录
log_error = /data/mysql/mariadb.err#记录错误日志文件
pid-file = /data/mysql/mariadb.pid#pid所在的目录
skip-external-locking#不使用系统锁定,要使用myisamchk,必须关闭服务器
key_buffer_size = 64M#缓存MyISAM存储引擎的索引参数。MySQL5.5默认为InnoDB存储引擎,所以这个参数可以设置小点,64MB即可
max_allowed_packet = 1M#允许最大接收数据包的大小,防止服务器发送过大的数据包。可以设置为16MB或者更大,但设置的太大也可能有危险。
table_open_cache = 256#MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值64,假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件描述符数目);当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上。
sort_buffer_size = 1M#在表进行order by和group by排序操作时,由于排序的字段没有索引,会出现Using filesort,为了提高性能,可用此参数增加每个线程分配的缓冲区大小。默认为256KB,这个参数不要设置过大。另外,一般出现Using filesort的时候,要通过增加索引来解决。
net_buffer_length = 8K#包消息缓冲区初始化为net_buffer_length字节,但需要时可以增长到max_allowed_packet字节。
read_buffer_size = 1M#该参数用于表的顺序扫描,表示每个线程分配的缓冲区大小。比如在进行全表扫描时,MySQL会按照数据的存储顺序依次读取数据块,每次读取的数据块首先会暂存在read_buffer_size中,当buffer空间被写满或者全部数据读取结束后,再将buffer中的数据返回给上层调用者,以提高效率。默认为128K,这个参数不要设置过大。
read_rnd_buffer_size = 512K#该参数用于表的随机读取,表示每个线程分配的缓冲区大小。比如,按照一个非索引字段做order by排序操作时,就会利用这个缓冲区来暂存读取的数据。默认为256KB,这个参数不要设置过大,一般在128~512KB。
myisam_sort_buffer_size = 16M#当对MyISAM表执行repair table或创建索引时,用以缓存排序索引;设置太小时可能会遇到” myisam_sort_buffer_size is too small”
thread_cache_size = 32#线程池,线程缓存。用来缓存空闲的线程,以至于不被销毁,如果线程缓存在的空闲线程,需要重新建立新连接,则会优先调用线程池中的缓存,很快就能响应连接请求。每建立一个连接,都需要一个线程与之匹配。
query_cache_size = 32M#缓存select语句和结果集大小的参数。查询缓存会存储一个select查询的文本与被传送到客户端的相应结果。如果之后接收到一个相同的查询,服务器会从查询缓存中检索结果,而不是再次分析和执行这个同样的查询。如果你的环境中写操作很少,读操作频繁,那么打开query_cache_type=1,会对性能有明显提升。如果写操作频繁,则应该关闭它(query_cache_type=0)。
tmp_table_size = 64M#临时HEAP数据表的最大长度(默认设置是32M); 超过这个长度的临时数据表将被转换为MyISAM数据表并存入一个临时文件。
explicit_defaults_for_timestamp = true#是否显示默认时间戳
#skip-networking
max_connections = 500#该参数用来设置最大连接数,告诉你当前你的服务器允许多少并发连接。默认为100,一般设置为512-1000即可。请记住,太多的连接会导致内存的使用量过高并且会锁住你的 MySQL 服务器。一般小网站需要 100-200 的连接数,而较大可能需要 500-800 甚至更多。这里的值很大程度上取决于你 MySQL/MariaDB 的使用情况。
max_connect_errors = 100#如果有时网络抽风,或者应用配置错误,或者其他原因导致客户端短时间内不断的尝试连接,客户端可能会被列入黑名单,然后将无法连接,直到再次刷新主机缓存。这个选项默认值太小了,可以考虑设的足够大(如果你的服务器配置够强大的话)。
open_files_limit = 65535#mysql打开最大文件数

log-bin=mysql-bin#这些路径相对于datadir
binlog_format=mixed#日志格式
server-id = 1#给服务器分配一个独一无二的ID编号; n的取值范围是1~2的32次方启用二进制日志功能。在复制数据同步的时候会用到
expire_logs_days = 10#启用二进制日志后,保留日志的天数。服务器会自动清理指定天数前的日志文件,如果不设置则会导致服务器空间耗尽。一般设置为7~14天。

default_storage_engine = InnoDB#新数据表的默认存储引擎(默认设置是MyISAM)。这项设置还可以通过–default-table-type选项来设置。
innodb_file_per_table = 1#InnoDB 提供了更灵活的方式,它把每个数据库的信息保存在一个 .ibd 数据文件中。每个 .idb 文件代表它自己的表空间。通过这样的方式可以更快地完成类似 “TRUNCATE” 的数据库操作,当删除或截断一个数据库表时,你也可以回收未使用的空间。这样配置的另一个好处是你可以将某些数据库表放在一个单独的存储设备。这可以大大提升你磁盘的 I/O 负载。
innodb_data_home_dir = /data/mysql#InnoDB主目录,所有与InnoDB数据表有关的目录或文件路径都相对于这个路径。在默认的情况下,这个主目录就是MySQL的数据目录。
innodb_data_file_path = ibdata1:10M:autoextend#用来容纳InnoDB为数据表的表空间: 可能涉及一个以上的文件; 每一个表空间文件的最大长度都必须以字节(B)、兆字节(MB)或千兆字节(GB)为单位给出; 表空间文件的名字必须以分号隔开; 最后一个表空间文件还可以带一个autoextend属性和一个最大长度(max:n)。
innodb_log_group_home_dir = /data/mysql#用来存放InnoDB日志文件的目录路径(如ib_logfile0、ib_logfile1等)。在默认的情况下,InnoDB驱动程序将使用 MySQL数据目录作为自己保存日志文件的位置。
innodb_buffer_pool_size = 256M#这个参数是InnoDB存储引擎的核心参数,默认为128KB,这个参数要设置为物理内存的60%~70%。
innodb_log_file_size = 64M#事务日志文件写操作缓存区的最大长度(默认设置是1MB)。
innodb_log_buffer_size = 8M#事务日志所使用的缓存区。InnoDB在写事务日志的时候,为了提高性能,先将信息写入Innodb Log Buffer中,当满足innodb_flush_log_trx_commit参数所设置的相应条件(或者日志缓冲区写满)时,再将日志写到文件(或者同步到磁盘)中。可以通过innodb_log_buffer_size参数设置其可以使用的最大内存空间。默认是8MB,一般为16~64MB即可。
innodb_flush_log_at_trx_commit = 1#这个选项决定着什么时候把日志信息写入日志文件以及什么时候把这些文件物理地写(术语称为”同步”)到硬盘上。设置值0的意思是每隔一秒写一次日 志并进行 同步,这可以减少硬盘写操作次数,但可能造成数据丢失; 设置值1(设置设置)的意思是在每执行完一条COMMIT命令就写一次日志并进行同步,这可以防止数据丢失,但硬盘写操作可能会很频繁; 设置值2是一般折衷的办法,即每执行完一条COMMIT命令写一次日志,每隔一秒进行一次同步。
innodb_lock_wait_timeout = 50#如果某个事务在等待n秒(s)后还没有获得所需要的资源,就使用ROLLBACK命令放弃这个事务。这项设置对于发现和处理未能被InnoDB数据表驱动 程序识别出来的死锁条件有着重要的意义。这个选项的默认设置是50s。

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 64M
sort_buffer_size = 1M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout
一键安装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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值