Windows 和 Linux 版安装详细步骤。
常用语句 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 # 创建数据库 create database if not exists basedb;create database if not exists archedb;# 创建用户 create user if not exists 'base' @'%' identified by '123456789' , 'arche' @'%' identified by '123456789' ; # 创建角色并授予权限 create role if not exists 'baserole' @'%' , 'archerole' @'%' ;grant all privileges on basedb.* to 'baserole' @'%' ;grant all privileges on archedb.* to 'archerole' @'%' ;#grant select on * .* to 'baserole' @'%' ; #grant select on * .* to 'archerole' @'%' ; grant replication slave on * .* to 'baserole' @'%' ; # 将任何库下任何表的主从复制权限授予给角色# 给用户赋予角色 grant 'baserole' to 'base' @'%' ;grant 'archerole' to 'arche' @'%' ;# 激活角色 set default role all to 'base' @'%' , 'arche' @'%' ;flush privileges; show databases;select host, user , plugin from mysql.user;show grants for 'baserole' @'%' ;show grants for 'base' @'%' ;show tables from basedb;# 删除角色 drop role if exists 'baserole' , 'archerole' ;# 删除用户 drop user if exists 'base' @'%' , 'arche' @'%' ;# 删除数据库 drop database if exists basedb;drop database if exists archedb;
官方doc mysqld、mysqld_safe、mysqld_multi 会识别配置文件中哪个组的哪些选项?
Windows(ZIP包) 配置环境变量 解压 zip 包到 D:\Program Files\
。
1 2 3 4 5 MYSQL_HOME D:\database \mysql -8.0.33-winx64 # 追加到Path %MYSQL_HOME %\bin
配置文件my.ini 创建 my.ini 配置文件,从MySQL8.0开始,数据库的默认编码为utf8mb4。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [client] default-character-set =utf8mb4[mysqld] port = 3306 max_connections =200 character-set-server =utf8mb4default-storage-engine =INNODBlower_case_table_names =1 default_password_lifetime =180 activate_all_roles_on_login =on default-time-zone ='+00:00'
lower_case_file_system :此变量描述数据所在的操作系统的文件目录是否区分大小写。ON 大小写不敏感,OFF 大小写敏感。此变量只读 ,因为它反映了文件系统的属性,设置它对文件系统没有影响。
lower_case_table_names :库表 是否大小写敏感,可以修改 ,参数有三种。
**0:Unix、Linux 的默认值。**表名存储为给定的大小和比较是区分大小写的
**1:Windows的默认值。**表名存储在磁盘是小写的,但是比较的时候是不区分大小写
**2:Mac OS X的默认值。**表名存储为给定的大小写但是比较的时候是小写的
安装和卸载 为了避免不必要的麻烦,下文命令均用管理员执行。
1 2 3 4 5 6 # 初始化数据目录,执行完成后会输出root用户的初始默认密码。默认data目录在MYSQL_HOME下创建。可删除data目录再次执行此命令。 C:\> mysqld --initialize --console # 安装服务 C :\> mysqld --install 服务名 # 默认服务名为MySQL # 卸载服务 C :\> mysqld --remove 服务名 # 默认服务名为MySQL
mysql.exe 是一个命令行客户端,用于以交互方式或批处理模式执行SQL语句。
mysqld.exe 是一个服务。d 的全拼是 daemon ,也就是守护程序的意思,常驻与后台。
1 2 3 # Linux系统里服务一般都是以d结尾,比如httpd,mysqld等。在开启服务时要用服务的名字 systemctl start mysqld.service service stop mysqld
启动 使用服务启动,或命令启动
1 2 3 4 5 6 7 # 启动MySQL服务 C:\> net start MySQL 服务名 # 停止MySQL 服务 C :\> net stop MySQL 服务名# Windows 下默认服务名mysql ,而Linux 下服务名mysqld C :\> net start mysql
登录 1 mysql -h 主机名 -P 端口号 -u 用户名 -p密码
如果我们要登录本机的 MySQL 数据库,只需要输入以下命令即可:
注意:
-p与密码之间不能有空格,其他参数名与参数值之间可以有空格也可以没有空格。如:
1 C:\> mysql -hlocalhost -P3306 -uroot -pabc123
密码建议在下一行输入,保证安全
1 2 C:\> mysql -h localhost -P 3306 -u root -p Enter password :****
客户端和服务器在同一台机器上,所以输入localhost或者IP地址127.0.0.1。同时,因为是连接本 机: -hlocalhost就可以省略,如果端口号没有修改:-P3306也可以省略,简写成:
1 2 C:\> mysql -u root -p Enter password :****
连接成功后,有关于MySQL Server服务版本的信息,还有第几次连接的id标识 。
也可以在命令行 通过以下方式获取MySQL Server服务版本的信息:
1 2 c:\> mysql -V c :\> mysql --version
或登录 后,通过以下方式查看当前版本信息:
1 mysql> select version();
密码设置 登录后执行
1 2 mysql> alter user 'root' @'localhost' identified by '123456789' password expire never; mysql> flush privileges;
flush privileges;
将当前 user 和 privilige 表中的 用户信息/权限设置 从 mysql 库( MySQL 数据库的内置库)中提取到内存里。 MySQL 用户数据和权限有修改后,希望在不重启MySQL服务 的情况下直接生效,那么就需要执行这个命令。
常见问题 客户端字符集 若MySQL服务器配置的服务端和客户端字符集是utf-8,而你的客户端的字符集是GBK,则会出现乱码。
解决方案,设置当前连接的客户端字符集 set names utf8;
,等同于
1 2 3 SET character_set_client= 'utf8' ;SET character_set_connection= 'utf8' ;SET character_set_results= 'utf8' ;
修改数据库和表的字符编码 修改编码: (1)先停止服务,(2)修改my.ini文件(3)重新启动服务
说明:如果是在修改 my.ini
之前建的库和表,那么库和表的编码还是原来的Latin1,要么删了重建,要么使用 alter语句修改编码。
1 2 3 4 5 6 7 8 mysql> create database testdb charset Latin1; mysql> use testdb; mysql> show create table student\G mysql> alter table student charset utf8mb4; # 修改表字符编码为utf8mb4 mysql> show create table student\G mysql> alter table student modify name varchar (20 ) charset utf8mb4; #修改字段字符编码为utf8mb4 mysql> show create database testbd; mysql> alter database testdb charset utf8mb4; # 修改数据库的字符编码为utf8
Linux 安装方式 YUM 傻瓜式,安装后文件分散
RPM包 掌握,安装后文件分散
通用二进制文件(二进制GLIBC) 掌握,无需编译,推荐 。
源码编译 了解
关闭防火墙 1 2 3 4 5 firewall-cmd --state systemctl start firewalld systemctl stop firewalld systemctl enable firewalld systemctl disable firewalld
禁用 SELinux 编辑 vim /etc/selinux/config
1 2 3 4 5 SELINUX =disabled # 禁用 setenforce Permissive
禁用swap分区 请禁用交换分区
1 free -m -s 5 # -m 以MB为单位显示内存使用情况;-s<间隔秒数> 持续观察内存使用状况。
RPM包 官方doc: https://dev.mysql.com/doc/refman/8.4/en/linux-installation.html
下载 官网下载 MySQL Community Server:https://dev.mysql.com/downloads/
1 2 3 Select Version: 8.4.4 LTS Select Operating System: Red Hat Enterprise Linux / Oracle Linux Select OS Version: Red Hat Enterprise Linux 8 / Oracle Linux 8 (x86, 64-bit)
RPM Bundle :mysql-8.4.3-1.el8.x86_64.rpm-bundle.tar
,包含MySQL所有组件。
检查&卸载 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 rpm -qa | grep -i mysql # -a 查询所有套件;-q 使用询问模式;-i 忽略大小写 yum list installed | grep mysql # 列出已安装的安装包 yum remove \ mysql-community-server-8.4.4-1.el8.x86_64 \ mysql-community-libs-8.4.4-1.el8.x86_64 \ mysql-community-client-8.4.4-1.el8.x86_64 \ mysql-community-common-8.4.4-1.el8.x86_64 \ mysql-community-icu-data-files-8.4.4-1.el8.x86_64 \ mysql-community-client-plugins-8.4.4-1.el8.x86_64 # 卸载上述命令查询出的已安装程序 rpm -qa | grep -i mysql # 确认是否残留 find / -name mysql # 按文件名查找 rm -rf \ /var/lib/mysql \ /var/lib/mysql/mysql \ /var/lib/selinux/targeted/active/modules/100/mysql \ /usr/lib64/mysql \ /usr/share/bash-completion/completions/mysql \ /usr/share/selinux/targeted/default/active/modules/100/mysql # 删除上述命令查找出的相关文件 find / | grep .*mysql.* rpm -qa | grep -i mariadb # 检查是否安装mariadb。Redhat默认安装 # rpm -e xxx xxx xxx yum remove \ mariadb-connector-c-3.1.11-2.el8_3.x86_64 \ mariadb-connector-c-config-3.1.11-2.el8_3.noarch # 推荐使用 find / -name my.cnf # 删除所有查询出的配置文件 # 检查依赖组件 rpm -qa | grep libaio rpm -qa | grep net-tools
安装 安装文件布局请参阅: https://dev.mysql.com/doc/refman/8.4/en/linux-installation-rpm.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 mkdir -p /opt/local/mysql # -p 确保目录名称存在,不存在的就建一个。 cd /opt/local/mysql # tar -xvf mysql-8.4.3-1.el8.x86_64.rpm-bundle.tar -C /opt/local/mysql tar -xvf mysql-8.4.3-1.el8.x86_64.rpm-bundle.tar rpm -ivh --test mysql-community-server-8.4.4-1.el8.x86_64.rpm # 仅作测试,并不真的安装套件。检查依赖关系(解析依赖/检查依赖) # 以下组件按顺序安装,可全选复制粘贴执行 rpm -Uivh mysql-community-common-8.4.4-1.el8.x86_64.rpm # 服务器和客户端库的通用文件。-U 升级指定的套件档。 rpm -ivh mysql-community-client-plugins-8.4.4-1.el8.x86_64.rpm # 客户端应用程序的共享插件 rpm -ivh mysql-community-libs-8.4.4-1.el8.x86_64.rpm # 数据库客户端应用程序的共享库 rpm -ivh mysql-community-client-8.4.4-1.el8.x86_64.rpm # 客户端应用程序和工具 rpm -ivh mysql-community-icu-data-files-8.4.4-1.el8.x86_64.rpm # 包装 MySQL 正则表达式所需的 ICU 数据文件 rpm -ivh mysql-community-server-8.4.4-1.el8.x86_64.rpm # 数据库服务器及相关工具 rpm -qa | grep -i mysql mysql --version # 或 mysqladmin --version
创建数据目录 初始化数据目录时会自动创建,也可以自己创建并写到配置,下面授予权限
1 2 3 4 # 初始化数据目录时如果没有--user选项,需要向mysql用户和mysql组授予目录所有权,并适当设置目录权限,否则服务启动失败 # 将指定文件的拥有者改为指定的用户或组。chown [-cfhvR] [--help ] [--version] user[:group] file... # chown -R mysql:mysql /var/lib/mysql # chmod 777 /var/lib/mysql
修改配置 备份默认配置文件 cp /etc/my.cnf /etc/my.cnf.back
,修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [client] default-character-set =utf8mb4 [mysqld] datadir = /var/lib/mysql log-error = /var/log/mysqld.log pid-file = /var/run/mysqld/mysqld.pid secure_file_priv = /var/lib/mysql-files server_id = 1 port = 3306 socket = /var/lib/mysql/mysql.sock
初始化数据目录 1 2 3 4 5 6 7 8 9 # mysqld --verbose --help | grep initialize mysqld --verbose --help | grep user mysqld --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql # mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql # grep 'temporary password' /var/log/mysqld.log # cat /var/log/mysqld.log
在Unix和类Unix系统上,数据库目录和文件必须由mysql登录帐户拥有(规范操作),以便服务器在以后运行时具有对它们的读写访问权限。为了确保这一点,从系统root帐户启动mysqld并包含–user选项,如下所示:
mysqld –initialize –user=mysql # “默认安全”安装(即,包括生成随机初始root密码)。在这种情况下,密码被标记为已过期,您必须选择一个新密码。密码太难输啦
或
mysqld –initialize-insecure –user=mysql # 不会生成root密码,这是不安全的;假定您打算在将服务器投入生产使用之前及时为帐户分配密码。推荐
或者,在以mysql身份登录时执行mysqld,在这种情况下,您可以从命令中省略–user选项。在 Windows 上,使用以下命令之一:
mysqld –initialize –console mysqld –initialize-insecure –console
启动服务 1 2 3 4 5 6 7 8 9 10 11 12 13 systemctl status mysqld.service # 查看状态 systemctl start mysqld.service # 启动服务。网上说第一次启动会根据mysql配置文件自动初始化(未测试),查看临时密码见上文 systemctl stop mysqld.service # 关闭服务 systemctl restart mysqld.service # 重启服务 systemctl list-unit-files | grep mysqld.service # 查看服务是否自启动 systemctl disable mysqld.service # 关闭自启动 systemctl enable mysqld.service # 打开自启动 ps -ef | grep -i mysql # 查看进程 ll /root/.cache/vmware/drag_and_drop/ rm -rf /root/.cache/vmware/drag_and_drop/*
首次登录 1 2 3 4 5 # 使用 --initialize-insecure 初始化后的登录方式 mysql -u root --skip-password # 使用 --initialize 初始化后的登录方式 mysql -hlocalhost -P3306 -uroot -p mysql -u root -p
通用二进制文件(使用中 ) 官方doc: https://dev.mysql.com/doc/refman/8.4/en/binary-installation.html
下载 官网下载 MySQL Community Server:https://dev.mysql.com/downloads/
1 rpm -qa | grep glibc # 需根据操作系统glibc版本选择
Compressed TAR Archive :mysql-8.4.3-linux-glibc2.28-x86_64.tar.xz
,常规二进制发行版。本文使用
Compressed TAR Archive, Minimal Install :mysql-8.4.3-linux-glibc2.17-x86_64-minimal.tar.xz
,最小安装,不包括调试二进制文件,并去掉了调试符号。貌似 glibc 2.17 之后不提供了
TAR :mysql-8.4.3-linux-glibc2.28-x86_64.tar
。
检查&卸载 先按 RPM包
-> 检查&卸载
操作一遍,然后继续:
1 2 3 4 5 rpm -qa | grep -i ncurses-compat-libs # -a 查询所有套件;-q 使用询问模式;-i 忽略大小写 yum install ncurses-compat-libs yum deplist perl # 检查依赖组件/组件依赖 yum install perl
安装 1 2 3 4 5 6 7 8 mkdir -p /opt/local/mysql cd /opt/local/ tar xvf mysql-8.4.3-linux-glibc2.28-x86_64.tar.xz mv /opt/local/mysql-8.4.3-linux-glibc2.28-x86_64/* /opt/local/mysql/ rm -rf /opt/local/mysql-8.4.3-linux-glibc2.28-x86_64 # 创建指向安装目录的符号链接(软链接),这样可以轻松地将其引用为 /opt/local/mysql # ln -s mysql-8.4.3-linux-glibc2.28-x86_64 mysql
为了让mysqld命令可以在任何位置执行,需配置环境变量 ,参考:** 环境变量持久化 **
1 2 3 4 5 6 # 在/etc/profile文件末尾添加 echo "export PATH=/opt/local/mysql/bin:$PATH" >> /etc/profile # vim /etc/profile # export PATH=$PATH :/opt/local/mysql/bin# 使环境变量生效 source /etc/profile
创建数据目录 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 创建各实例数据存放目录 mkdir -p /opt/local/mysql/3306/{data,log,mysql-files} mkdir -p /opt/local/mysql/3307/{data,log,mysql-files} # 创建各实例error日志,可省略,会自动创建 # touch /opt/local/mysql/3306/log/error.log# touch /opt/local/mysql/3307/log/error.logtree /opt/local/mysql # 以树状图列出目录的内容。-d 显示目录名称而非内容。 groupadd mysql # 创建组 useradd -r -g mysql -s /bin/false mysql # 创建用户。-g 指定所属群组;-s 指定用户登入后所使用的shell。 chown -R mysql:mysql /opt/local/mysql # 设置文件拥有者,user:group # chmod 770 /opt/local/mysql # userdel -r mysql # groupdel mysql
修改配置 登录MySQL可查看变量: show variables like '%secure_file_priv%';
。
新建配置文件 vim /opt/local/mysql/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 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 [client] default-character-set = utf8mb4 [mysqld] user = mysql # 以哪个系统账户运行mysqld bind_address = * # 当绑定多个值时,不允许通配符。不支持正则。IP地址必须存在。 basedir = /opt/local/mysql # MySQL基本安装目录。服务器可执行文件在启动时确定自己的完整路径名,并使用其所在目录的父目录作为默认basedir值。 local_infile = OFF # mysqlx = OFF # lc_messages_dir = /opt/local/mysql/share # lc_messages = en_US # 在这种情况下,mysqld将区域设置en_US映射到语言english,并在/opt/local/mysql/share/english目录中查找错误文件 default_password_lifetime = 180 # 全局密码自动过期策略,每N天修改一次 max_connections = 10 # 允许同时连接的最大客户端数量,默认151,最小1,最大100000。最大有效值为 (open_files_limit 的有效值 - 810) 与 max_connections 实际设置的值中的较小者。状态变量 connection_errors_max_connections:由于达到服务器 max_connections 限制,因此拒绝的连接数。 back_log = -1 # 表示在MySQL暂时停止响应新请求之前,在这段短时间内可以堆叠多少个请求。仅当您预计在短时间内会有大量连接时才需要增加此值。默认值 -1(表示自动调整大小;不要分配该文字值),默认调整为 max_connections 的值。 max_connect_errors = 100 # 当主机的 max_connect_errors 次连续连接请求被中断且未成功连接时,服务器将阻止该主机继续连接。 character_set_server = utf8mb4 # 服务默认字符集 lower_case_table_names = 1 # 此选项适用于数据库名称和表名称。0:存储区分大小写,比较区分大小写; 1:存储小写,比较不区分大小写; 2:存储区分大小写,比较小写 default-time-zone = '+08:00' # 设置服务器默认时区,若未指定则与系统时区相同 skip-grant-tables = OFF # 需重启。该配置使所有用户登录当前数据库都免密,修改密码后立即去掉。 activate_all_roles_on_login = OFF # default_storage_engine = InnoDB # 为永久表设置存储引擎 default_tmp_storage_engine = InnoDB # 临时表的默认存储引擎 log_timestamps = SYSTEM transaction_isolation = REPEATABLE-READ # 设置默认事务隔离级别 max_allowed_packet = 67108864 # 默认67108864(64MB),最小1024。 tmp_table_size = 16777216 # 默认16777216(16MB),最小1024, max_heap_table_size = 16777216 # 默认16777216(16MB),最小16384(16KB) init_connect = 'SET NAMES utf8mb4' # 服务器将为每个连接的客户端执行的字符串。 thread_cache_size = -1 # 服务器应缓存多少个线程以供重复使用。当客户端断开连接时,如果缓存中的线程数少于 thread_cache_size,则该客户端的线程将被放入缓存中。默认值 -1(表示自动调整大小;不要分配该文字值),默认值基于以下公式,上限为100: 8 + (max_connections / 100)。可以结合状态变量调整线程池大小 show global status like 'Thread%'。 thread_stack = 1048576 # 每个线程的堆栈大小。默认值对于正常操作来说足够大。如果线程堆栈大小太小,则会限制服务器可以处理的SQL语句的复杂性、存储过程的递归深度以及其他消耗内存的操作。默认1048576(1MB),最小131072(128KB)。 wait_timeout = 28800 # 默认28800。服务器在关闭 非交互式连接 之前等待该连接活动的秒数。在线程启动时,会话 wait_timeout 值从全局 wait_timeout 值或全局 interactive_timeout 值初始化,取决于客户端的类型(由 mysql_real_connect() 的 CLIENT_INTERACTIVE 连接选项定义)。 interactive_timeout = 28800 # 默认28800。服务器在关闭 交互式连接 之前等待该连接活动的秒数。交互式客户端定义为使用 mysql_real_connect() 的 CLIENT_INTERACTIVE 选项的客户端。另请参阅 wait_timeout。 sort_buffer_size = 262144 # 每个必须执行排序的会话都会分配一个该大小的缓冲区。不特定于任何存储引擎,并且以通用方式应用以进行优化。值必须足够大,以便在排序缓冲区中容纳十五个元组。增加 max_sort_length 的值可能需要增加 sort_buffer_size 的值。如果您在 SHOW GLOBAL STATUS 输出中看到每秒有许多 Sort_merge_passes,则可以考虑增加 sort_buffer_size 值以加快无法通过查询优化或改进索引来改进的 ORDER BY 或 GROUP BY 操作。默认262144(256KB),最小32768(32KB)。 join_buffer_size = 262144 # 用于 普通索引扫描、范围索引扫描、不使用索引并因此执行全表扫描 的连接,所使用的缓冲区的最小大小。默认262144(256KB),最小128。 read_buffer_size = 131072 # 对MyISAM表进行顺序扫描的每个线程都会为其扫描的每个表分配一个此大小(以字节为单位)的缓冲区。如果执行多次顺序扫描,您可能需要增加该值,默认131072(128KB),最小8192(8KB)。 binlog_cache_size = 32768 # 当服务器上启用二进制日志记录时,如果服务器支持任何事务存储引擎,则为每个客户端分配一个二进制日志缓存。如果事务的数据超出了内存缓冲区的空间,则超出的数据将存储在临时文件中。默认32768(32KB),最小4096。 max_binlog_cache_size = 18446744073709547520 # 如果事务需要超过这么多字节,服务器会生成多语句事务需要超过“max_binlog_cache_size”字节的存储错误。当gtid_mode不为ON时,最大推荐值为4GB,因为在这种情况下,MySQL无法使用大于4GB的二进制日志位置;该选项仅设置事务缓存的大小;语句缓存的上限由 max_binlog_stmt_cache_size 系统变量控制。最小4096。 key_buffer_size = 8388608 # MyISAM 表的索引块被缓冲并由所有线程共享。该选项是用于索引块的缓冲区的大小。密钥缓冲区也称为密钥缓存。默认8388608(8MB),最小0。 innodb_buffer_pool_size = 134217728 # 缓冲池的大小(以字节为单位),InnoDB 缓存表和索引数据的内存区域。默认134217728(128MB),最小5242880(5MB)。 innodb_buffer_pool_instances = 1 # InnoDB缓冲池划分的区域数。对于缓冲池大小在几GB范围内的系统,将缓冲池划分为单独的实例可以提高并发性,因为不同线程读取和写入缓存页面时会减少争用。使用哈希函数将存储在缓冲池中或从缓冲池读取的每个页面随机分配给其中一个缓冲池实例。每个缓冲池管理自己的空闲列表、刷新列表、LRU 以及连接到缓冲池的所有其他数据结构,并受自己的缓冲池互斥锁保护。\n 总缓冲池大小在所有缓冲池之间分配。为了获得最佳效率,请指定 innodb_buffer_pool_instances 和 innodb_buffer_pool_size 的组合,以便每个缓冲池实例至少为 1GB。 innodb_buffer_pool_dump_pct = 25 # 指定每个缓冲池要读出并转储的最近使用的页面的百分比。范围是 1 到 100。默认值为 25。例如,如果有 4 个缓冲池,每个缓冲池有 100 个页面,并且 innodb_buffer_pool_dump_pct 设置为 25,则会转储每个缓冲池中最近使用的 25 个页面。人话:MySQL正常关闭时把buffer中页信息保存到磁盘,启动后再从磁盘加载到buffer,实现服务器快速预热。 innodb_data_file_path = ibdata1:12M:autoextend # 定义InnoDB系统表空间数据文件的名称、大小和属性。file_name:file_size[:autoextend[:max:max_file_size]] innodb_file_per_table = ON # ON:在每表文件的表空间中创建表(独立表空间); OFF:在系统表空间中创建表(系统表空间) innodb_redo_log_archive_dirs = NULL # 定义可创建重做日志存档文件的带标签目录。您可以在以分号分隔的列表中定义多个带标签目录。默认值为NULL,不允许激活重做日志归档。 innodb_redo_log_capacity = 104857600 # 默认104857600(100MB)。定义重做日志文件占用的磁盘空间量。已经取代 innodb_log_file_size 和 innodb_log_files_in_group。总共的redo日志文件大小其实就是: innodb_log_file_size * innodb_log_files_in_group。 innodb_log_buffer_size = 67108864 # redo log bufer。默认67108864(64MB),最小1048576(1MB)。InnoDB用于写入磁盘日志文件的缓冲区大小。较大的日志缓冲区使得大型事务能够运行,而无需在事务提交之前将日志写入磁盘。因此,如果您有更新、插入或删除多行的事务,则增大日志缓冲区可以节省磁盘 I/O。尚硅谷:为了提高性能,也是先将信息写入 Innodb Log Buffer 中,当满足 innodb_flush_log_trx_commit 参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写到文件(或者同步到磁盘)中。 innodb_flush_log_at_trx_commit = 1 # 从redo log bufer刷盘到redo log file的策略。为了在使用事务的复制设置中实现持久性和一致性InnoDB,始终设置 innodb_flush_log_at_trx_commit=1 (完全符合 ACID 要求,默认设置 1。每次提交事务时,日志都会写入并刷新到磁盘)。 innodb_undo_tablespaces = 2 # 定义InnoDB使用的undo表空间的数量。默认值和最小值为2,最大值127。 innodb_undo_log_truncate = ON # 启用后,超过 innodb_max_undo_log_size 定义的阈值的undo表空间将被标记为截断。只有undo表空间才能被截断。不支持截断驻留在系统表空间中的undo日志。要进行截断,必须至少有两个undo表空间。 innodb_max_undo_log_size = 1073741824 # 定义undo表空间的阈值大小。如果undo表空间超出阈值,则在启用 innodb_undo_log_truncate 时可以将其标记为截断。默认1073741824(1GB),最小10485760(10MB)。 innodb_print_all_deadlocks = OFF # 当启用此选项时,有关 InnoDB 用户事务中的所有死锁的信息都将记录在 mysqld 错误日志中。 innodb_flush_sync = ON # 默认启用,在检查点发生 I/O 活动突发期间,会忽略 innodb_io_capacity 和 innodb_io_capacity_max 配置。为了遵守 innodb_io_capacity 和 innodb_io_capacity_max 定义的 I/O 速率,请禁用 innodb_flush_sync。 innodb_io_capacity = 200 # 默认值10000。定义InnoDB后台任务可用的每秒 I/O 操作数 (IOPS),例如从缓冲池刷新页面和从更改缓冲区合并数据。人话:缓冲区刷新到磁盘时,每秒刷新的脏页数量; innodb_io_capacity_max = 400 # 默认 2 * innodb_io_capacity。 innodb_read_io_threads = 4 # 默认值为 CPUCore / 2。 InnoDB 中用于读取操作的 I/O 线程数。写入线程的对应项是 innodb_write_io_threads。 innodb_write_io_threads = 4 # 默认值为 4。 InnoDB 中用于写入操作的 I/O 线程数。读取线程的对应项是 innodb_read_io_threads。 innodb_lock_wait_timeout = 50 # InnoDB 事务在放弃之前等待行锁的时间长度(以秒为单位)。默认值为 50 秒。 table_open_cache = 4000 # 所有线程打开的表的数量。增加此值会增加 mysqld 所需的文件描述符的数量。默认 4000 = MAX((open_files_limit - 10 - max_connections) / 2, 400),最大524288。 table_definition_cache = -1 # 范围 400 ~ 524288。默认值-1(表示自动调整大小;不要分配该文字值)。 open_files_limit = 8161 # 操作系统中 mysqld 可用的文件描述符数量。默认 8161 = 10 + max_connections + (table_open_cache * 2),该值是从三种计算方式中取的最大值,详见官网。 general_log = OFF # 是否启用通用查询日志。日志输出的目标由 log_output 系统变量控制;如果该值为 NONE,则即使启用了日志也不会写入任何日志条目。默认OFF。 general_log_file = localhost.log # 通用查询日志文件的名称。默认值host_name.log。 long_query_time = 10 # 如果查询花费的时间超过这么多秒,服务器将增加Slow_queries状态变量。如果启用了慢查询日志,则查询将记录到慢查询日志文件中。默认值10秒,最小0秒。 slow_query_log = ON # 是否启用慢查询日志。日志输出的目的地由log_output系统变量控制;如果该值为 NONE,则即使启用了日志也不会写入任何日志条目。“慢”由 long_query_time 变量的值决定。默认OFF。 slow_query_log_file = localhost-slow.log # 慢查询日志文件的名称。默认值 host_name-slow.log。 log_queries_not_using_indexes = ON # 如果在启用慢查询日志的情况下启用此变量,则会记录预期检索所有行的查询。此选项并不一定意味着不使用索引。例如,使用完整索引扫描的查询使用索引,但会被记录,因为索引不会限制行数。默认OFF。 log_throttle_queries_not_using_indexes = 0 # 如果启用了 log_queries_not_using_indexes,则 log_throttle_queries_not_using_indexes 变量会限制每分钟可写入慢查询日志的此类查询的数量。默认值0,表示“无限制”。 min_examined_row_limit = 0 # 检查少于此行数的查询将不会记录到慢查询日志中。设置此系统变量的会话值是一项受限制的操作。会话用户必须具有足够的权限才能设置受限制的会话变量。默认值0。 log_slow_replica_statements = ON # 开启从服务器的慢查询日志。请查阅官网... log-bin = binlog # 二进制日志文件名称,也可以加上路径 /opt/local/mysql/3306/data/binlog。数据库文件最好不要与日志文件放在同一个磁盘上,当数据库文件所在的磁盘发生故障时,可以使用日志文件恢复数据。 binlog_expire_logs_seconds = 2592000 # 设置二进制日志的有效期(以秒为单位)。有效期结束后,二进制日志文件可以被自动删除。可能的删除发生在启动时以及二进制日志刷新时。可以通过将 binlog_expire_logs_auto_purge 系统变量设置为 OFF 来禁用二进制日志的自动清除。此设置优先于 binlog_expire_logs_seconds 的任何设置。要手动删除二进制日志文件,请使用 PURGE BINARY LOGS 语句。默认2592000秒(30天)。 binlog_expire_logs_auto_purge = ON # 启用或禁用二进制日志文件的自动清除。清除之前等待的间隔由 binlog_expire_logs_seconds 控制。即使 binlog_expire_logs_auto_purge 处于 ON 状态,将 binlog_expire_logs_seconds 设置为 0 也会停止自动清除。此变量对 PURGE BINARY LOGS 没有影响。默认值ON。 max_binlog_size = 200M # 每次重启会新建。事务以一个块的形式写入二进制日志,因此它永远不会被拆分到多个二进制日志中。因此,如果您有大型事务,您可能会看到二进制日志文件大于 max_binlog_size。如果 max_relay_log_size 为 0,则 max_binlog_size 的值也适用于中继日志。最大值和默认值为1073741824(1GB)。 log_bin_trust_function_creators = OFF # 此变量在启用二进制日志记录时适用。限制存储过程,因为二进制日志的一个重要功能是用于主从复制,而存储函数(now())有可能导致主从的数据不一致。所以当开启二进制日志后,需要限制存储函数的创建、修改、调用。 binlog_format = ROW # 默认ROW(MIXED、STATEMENT、ROW)。 binlog_row_image = full # binlog-ignore-db = test # 不要复制的数据库 binlog-do-db = basedb # 需要复制的数据库 sync_binlog = 1 # 为了在使用事务的复制设置中实现持久性和一致性InnoDB,如果启用了二进制日志记录,请设置 sync_binlog=1。 relay_log = relaylog # 中继日志文件名称 max_execution_time = 0 # 默认值0,不启用超时。SELECT语句的执行超时时间(以毫秒为单位)。存储程序中的 SELECT 语句会忽略 max_execution_time。 read_only = OFF [mysqld_multi] user = root # 调用mysqladmin时使用的MySQL帐户的用户名。用于stop多实例 pass = 123456789 # 调用mysqladmin时使用的MySQL帐户的密码。用于stop多实例 mysqld = /opt/local/mysql/bin/mysqld_safe # 要使用的mysqld二进制文件。mysqld_safe是启动Unix上的 mysqld服务器的推荐方法。mysqld_safe添加了一些安全功能,例如在发生错误时重新启动服务器以及将运行时信息记录到错误日志中。 mysqladmin = /opt/local/mysql/bin/mysqladmin # 用于停止服务器的mysqladmin二进制文件 log = /opt/local/mysql/mysqld_multi.log [mysqld3306] basedir = /opt/local/mysql # MySQL安装基目录的路径。 datadir = /opt/local/mysql/3306/data # MySQL服务器数据目录的路径。相对路径是相对于当前目录解析的。如果您希望服务器自动启动(即在您无法提前知道当前目录的环境中),最好将 datadir 值指定为绝对路径。 log-error = /opt/local/mysql/3306/log/error.log # 将默认错误日志目标设置为指定的文件。这会影响以默认目标为基础输出目标的日志接收器。如果该选项没有指定文件,则 Unix 和类 Unix 系统上的默认错误日志目标是数据目录中名为 host_name.err 的文件。 pid-file = /opt/local/mysql/3306/mysql3306.pid # 5.7建议两层目录,否则启动时可能会卡住 secure_file_priv = /opt/local/mysql/3306/mysql-files # 服务器会将导入和导出操作限制为仅处理该目录中的文件。例如:load data、select...insert outfile语句,load_file()函数。 server_id = 3306 # 用于主从复制 port = 3306 socket = /tmp/mysql_3306.sock lower_case_table_names = 1 # 会在初始化数据目录和启动服务时,替换[mysqld]组的设置(存在多个选项组时,最后一个配置项生效) [mysqld3307] basedir = /opt/local/mysql datadir = /opt/local/mysql/3307/data log-error = /opt/local/mysql/3307/log/error.log pid-file = /opt/local/mysql/3307/mysql3307.pid secure_file_priv = /opt/local/mysql/3307/mysql-files server_id = 3307 # 用于主从复制 port = 3307 socket = /tmp/mysql_3307.sock lower_case_table_names = 1
初始化数据目录 mysqld
通常读取 [mysqld]
组。如果此选项以 --defaults-group-suffix=_other
给出,mysqld
还会读取 [mysqld_other]
组。最后读取的选项会覆盖最先读取的。
1 2 mysqld --defaults-file=/opt/local/mysql/my.cnf --defaults-group-suffix=3306 --initialize-insecure --user=mysql mysqld --defaults-file=/opt/local/mysql/my.cnf --defaults-group-suffix=3307 --initialize-insecure --user=mysql
启动(mysqld_multi)&自启(service)–使用中 启动(mysqld_multi) 若不指定 --defaults-file
,默认读取 /etc/my.cnf
或 ~/.my.cnf
。
mysqld_multi
在 my.cnf 中只会搜索名为 [mysqldN] 的组,N可以是任何正整数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # mysqld_multi [options] {start|stop|reload|report} [GNR[,GNR] ...] 多实例启动 mysqld_multi --defaults-file=/opt/local/mysql/my.cnf report # 查看mysql服务 mysqld_multi --defaults-file=/opt/local/mysql/my.cnf start # 启动所有组 mysqld_multi --defaults-file=/opt/local/mysql/my.cnf start 3306,3307 mysqld_multi --defaults-file=/opt/local/mysql/my.cnf stop # 关闭所有组 mysqld_multi --defaults-file=/opt/local/mysql/my.cnf stop 3306,3307 # 若启动失败,请查看 mysqld_multi.log 或 各实例的错误日志 cat -n /opt/local/mysql/mysqld_multi.log | tail -n 20 # 显示文件的最后 10 行。 cat -n /opt/local/mysql/3306/log/error.log | tail -n 20 cat -n /opt/local/mysql/3307/log/error.log | tail -n 20 # 清空日志文件 > /opt/local/mysql/mysqld_multi.log > /opt/local/mysql/3306/log/error.log > /opt/local/mysql/3307/log/error.log
自启(service) 新增启动文件 vim /etc/init.d/mysqld_multi
,或从mysql目录中复制并修改 cp /opt/local/mysql/support-files/mysqld_multi.server /etc/init.d/mysqld_multi
。
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 # !/bin/sh # # This script assumes that my.cnf file exists either in /etc/my.cnf or # /root/.my.cnf and has groups [mysqld_multi] and [mysqldN]. See the # mysqld_multi documentation for detailed instructions. # # # chkconfig: 2345 64 36 # description: A very fast and reliable SQL database engine. # # basedir=/opt/local/mysql bindir=/opt/local/mysql/bin export PATH=$bindir:$PATH if test -x $bindir/mysqld_multi then mysqld_multi="$bindir/mysqld_multi"; else echo "Can't execute $bindir/mysqld_multi from dir $basedir"; exit; fi case "$1" in 'start' ) "$mysqld_multi" --defaults-file=/opt/local/mysql/my.cnf start $2 ;; 'stop' ) "$mysqld_multi" --defaults-file=/opt/local/mysql/my.cnf stop $2 ;; 'report' ) "$mysqld_multi" --defaults-file=/opt/local/mysql/my.cnf report $2 ;; 'restart' ) "$mysqld_multi" --defaults-file=/opt/local/mysql/my.cnf stop $2 "$mysqld_multi" --defaults-file=/opt/local/mysql/my.cnf start $2 ;; *) echo "Usage: $0 {start|stop|report|restart}" >&2 ;; esac
启动
1 2 3 4 5 6 7 chmod 770 /etc/init.d/mysqld_multi service mysqld_multi report service mysqld_multi start service mysqld_multi start 3306,3307 service mysqld_multi stop service mysqld_multi stop 3306,3307
设置开机启动
1 2 3 # 设置 mysqld_multi 服务在运行级别为2、3、4、5时启动。--level 指定读系统服务要在哪一个Linux运行级别中开启或关闭。 chkconfig --level 2345 mysqld_multi on chkconfig --level 2345 mysqld_multi off
启动&自启(systemd) Linux 服务管理有两种方式service和systemctl。
使用systemd配置多个MySQL实例: https://dev.mysql.com/doc/refman/8.4/en/using-systemd.html
修改配置文件中的配置组名称,用 @ 作为分隔符,因为这是 systemd 支持的唯一分隔符。
1 2 [mysqld@3306] # 3306是实例的别名,可以定义成其他更有意义的名字 [mysqld@3307]
创建 systemd 服务配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 vim /etc/systemd/system/mysqld@.service # mysqld@.service 内容如下 [Unit] Description= MySQL server Documentation= https://zh.wikipedia.org/wiki/Systemd After=network.target After=syslog.target [Service] User=mysql Group=mysql Type=forking TimeoutSec=0 # %I是实例占位符,表示选项文件mysqld分组名中@符号后面的内容 ExecStart=/opt/local/mysql/bin/mysqld --defaults-file=/opt/local/mysql/my.cnf --defaults-group-suffix=@%I $MYSQLD_OPTS LimitNOFILE=65535 Restart=on-failure [Install] WantedBy=multi-user.target
重新加载systemd服务配置文件:systemctl daemon-reload
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # systemctl start mysqld@3306 systemctl start mysqld@3307 systemctl status mysqld@3306 systemctl status mysqld@3307 systemctl stop mysqld@3306 systemctl stop mysqld@3307 systemctl restart mysqld@3306 systemctl restart mysqld@3307 # 开机自启 systemctl enable mysqld@3306 systemctl enable mysqld@3307 # 关闭自启 systemctl disable mysqld@3306 systemctl disable mysqld@3307
两种自启动区别 systemd(systemctl)本身可以设置开机自启动,service(/etc/init.d/mysqld_multi)靠其本身不行,需要借助其他工具。
service需要通过mysqld_safe来间接启动mysqld,因为脚本是通过mysqld_multi命令启动,而[mysqld_multi]组中又指定了mysqld_safe启动;systemctl可以直接启动mysqld,可以看到mysqld@.service文件中使用的是mysqld命令。
首次登录/密码设置/远程访问 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 mysql -u root --skip-password -S /tmp/mysql_3306.sock mysql -u root -p -S /tmp/mysql_3306.sock # 修改密码/设置密码 ALTER USER 'root'@'localhost' IDENTIFIED BY '123456789'; # 永久修改密码 ALTER USER 'root'@'localhost' IDENTIFIED BY '123456789' PASSWORD EXPIRE NEVER; # 修改身份验证插件,并永久修改密码。8.0之后默认的身份验证插件是 caching_sha2_password ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456789' PASSWORD EXPIRE NEVER; # 设置root远程访问 use mysql; select host, user, plugin from mysql.user; update user set host='%' where user='root'; flush privileges; quit/exit # 退出当前会话
使用mysql命令连接DB 1 2 3 4 mysql -h 192.168.0.7 -P 3306 -u base -p 123456789; use ideps; #或者 mysql -h192.168.0.7 -P3306 -ubase -p123456789 basedb;
数据库创建和删除 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 # 查看所有的数据库 mysql> show databases; # 创建数据库 create database 数据库名; 名称不能与已经存在的数据库重名。 mysql> create database if not exists basedb; mysql> create database if not exists archedb; mysql> show create database basedb; mysql> show create database archedb; # 删除数据库 mysql> drop database if exists basedb; mysql> drop database if exists archedb; # 查看某个库的所有表 mysql> show tables from basedb; # 使用basedb数据库 mysql> use basedb; mysql> show tables like '%base_%' ; # 创建学生表 create table student ( id int , name varchar (20 ) # 说名字最长不超过20 个字符 ); # 查看表的创建信息 mysql> show create table 表名称; mysql> show create table 表名称\G # 查看表结构 mysql> desc 表名称;
查看存储引擎 1 2 # 查看mysql提供的存储引擎 mysql> show engines;
查看服务器系统变量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 查看服务器系统变量,my.ini配置信息 mysql> show variables; mysql> show variables like 'character%' ; mysql> show variables like 'collation%' ; mysql> show variables like '%connections%' ; mysql> show variables like '%engine%' ; mysql> show variables like '%basedir%' ; mysql> show variables like '%port%' ; mysql> show global variables like '%lower_case%' ; # 查看当前mysql的大小写敏感配置 + | Variable_name | Value | + | lower_case_file_system | ON | | lower_case_table_names | 1 | + 2 rows in set , 1 warning (0.00 sec)