Linux 安装 MySQL

1)创建 MySQL 用户组和用户

  1. [root@localhost]# cat /etc/group | grep mysql
  2. [root@localhost]# cat /etc/passwd |grep mysql
  3. [root@localhost]# groupadd mysql
  4. [root@localhost]# useradd -r -g mysql mysql

2)从官网下载用于 Linux 的 MySQL 的安装包
下载地址:https://downloads.mysql.com/archives/community/
image.png
解压到 /usr/local/mysql 目录下:

  1. [root@localhost]# tar xzvf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
  2. [root@localhost]# mv mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz /usr/local/mysql

3)安装 MySQL
在 /usr/local/mysql 目录下创建 data 目录,用来存储数据:

  1. [root@localhost]# mkdir /usr/local/mysql/data

更改 mysql 目录下所有的目录及文件夹所属的用户组和用户以及权限:

  1. [root@localhost]# chown -R mysql:mysql /usr/local/mysql
  2. [root@localhost]# chmod -R 755 /usr/local/mysql

编译安装并初始化 MySQL,务必记住初始化输出日志末尾的密码(数据库管理员临时密码)

  1. [root@localhost]# cd /usr/local/mysql/bin
  2. [root@localhost]# ./mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql

示例输出如下:
image.png
记录日志最末尾位置 root@localhost: 后的字符串,此字符串即为 MySQL 管理员临时登录密码。

编辑配置文件 my.cnf,添加配置如下:

  1. [root@localhost]# vim /etc/my.cnf
  2. [root@localhost]# cat /etc/my.cnf
  3. [mysqld]
  4. datadir=/usr/local/mysql/data
  5. port=3306
  6. sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
  7. symbolic-links=0
  8. max_connections=600
  9. innodb_file_per_table=1
  10. lower_case_table_names=1
  11. character_set_server=utf8

测试启动 MySQL 服务器:

  1. [root@localhost]# cd /usr/local/mysql/support-files
  2. [root@localhost]# ./mysql.server start

显示如下结果,则说明数据库已安装并可以正常启动:
image.png
4)登录 MySQL 并修改临时密码
登录 MySQL:

  1. [root@localhost]# cd /usr/local/mysql/bin
  2. [root@localhost]# ./mysql -u root -p

成功登录后的界面如下:
image.png
修改临时密码:

  1. mysql> set password for root@localhost = password('yourpass');

开放远程连接:

  1. mysql> use mysql;
  2. mysql> update user set user.Host='%' where user.User='root';
  3. mysql> flush privileges;

最后,我们也可以把 usr/local/mysql/bin 目录添加到系统的 PATH 变量里方便使用,命令如下:

  1. vim ~/.bash_profile
  2. export PATH=/usr/local/mysql/bin:$PATH
  3. source ~/.bash_profile

配置文件

1. 组名

Linux 下 MySQL 的配置文件的默认路径在 /etc/my.cnf 这个地方,并且配置文件中的启动选项被划分为了若干个组,每个组有一个组名,用中括号 [] 扩起来,像这样:

  1. [server]
  2. ......
  3. [mysqld]
  4. ......
  5. [client]
  6. ......

配置文件中不同的选项组是给不同的启动命令使用的,如果选项组名称与程序名称相同,则组中的选项将专门应 用于该程序。例如,[mysqld] 和 [mysql] 组分别应用于 mysqld 服务器程序和 mysql 客户端程序。不过有两个选项组比较特别:

  • [server] 组下边的启动选项将作用于所有的服务器程序。
  • [client] 组下边的启动选项将作用于所有的客户端程序。

为了直观感受一下,我们挑一些启动命令来看一下它们能读取的选项组都有哪些:

启动命令 类别 能读取的组
mysqld 启动服务器 [mysqld]、[server]
mysqld_safe 启动服务器 [mysqld]、[server]、[mysqld_safe]
mysql 启动客户端 [mysql]、[client]
mysqladmin 启动客户端 [mysqladmin]、[client]
mysqldump 启动客户端 [mysqldump]、[client]

我们还可以在选项组的名称后加上特定的 MySQL 版本号,比如对于 [mysqld] 选项组来说,我们可以定义一个 [mysqld-5.7] 的选项组,它的含义和 [mysqld] 一样,只不过只有版本号为 5.7 的 mysqld 程序才能使用这个选
项组中的选项。

2. 常用参数

以 [mysqld] 组为例,可配置的重要配置文件参数说明如下:

  1. # mysql数据文件所在位置
  2. datadir = /usr/local/mysql/data
  3. # 事务隔离级别,默认为可重复读
  4. transaction_isolation = READ-COMMITTED
  5. # 数据库字符集
  6. character-set-server = utf8mb4
  7. # 数据库字符集对应一些排序等规则,注意要和character-set-server对应
  8. collation-server = utf8mb4_general_ci
  9. # 设置client连接mysql时的字符集,防止乱码
  10. init_connect='SET NAMES utf8mb4'
  11. # 是否对sql语句大小写敏感,1表示不敏感
  12. lower_case_table_names = 1
  13. # 最大连接数
  14. max_connections = 400
  15. # 最大错误连接数
  16. max_connect_errors = 1000
  17. # MySQL连接闲置超时时间(单位:秒),MySQL默认的wait_timeout值为8个小时, interactive_timeout参数需要同时配置才能生效
  18. interactive_timeout = 1800
  19. wait_timeout = 1800
  20. # 内存临时表的最大值,当执行group by、order by时可能用到临时表,超过该值会使用磁盘临时表,系统IO压力增大
  21. tmp_table_size = 134217728
  22. max_heap_table_size = 134217728
  23. ################################用户进程分配到的内存设置################################
  24. # order by或group by时用到
  25. sort_buffer_size = 2097152
  26. # 一般数据库中没什么大的事务,设成1~2M,默认32kb
  27. binlog_cache_size = 524288
  28. ####################################日志设置####################################
  29. # 数据库错误日志文件
  30. log_error = error.log
  31. # 慢查询sql日志设置
  32. slow_query_log = 1
  33. slow_query_log_file = slow.log
  34. # 慢查询执行的秒数,必须达到此值可被记录
  35. long_query_time = 8
  36. # 检索的行数必须达到此值才可被记为慢查询
  37. min_examined_row_limit = 100
  38. # mysql binlog日志文件保存的过期时间,过期后自动删除
  39. expire_logs_days = 5
  40. ####################################主从复制设置####################################
  41. # 开启mysql binlog功能
  42. log-bin=mysql-bin
  43. # binlog记录内容的方式,记录被操作的每一行
  44. binlog_format = ROW
  45. #对于binlog_format=ROW模式时,减少记录日志的内容,只记录受影响的列
  46. binlog_row_image = minimal
  47. #############################redolog和binlog的关系设置#############################
  48. # commit事务时,控制redolog buff持久化磁盘的模式,默认为1
  49. # 当设置为2时,在每个事务提交时,日志缓冲被写到文件,但不对日志文件做刷新到磁盘的操作,后台fsync每秒一次。因此,异常宕机只会丢失最后一秒的事务。
  50. innodb_flush_log_at_trx_commit = 2
  51. # commit事务时,控制写入binlog日志的模式,默认为0,即不主动与硬盘同步
  52. # 如果是autocommit模式,那么每执行一个语句就会向binlog日志写入一次,否则每个事务写入一次。如果sync_binlog的值为正,那么每当sync_binlog参数设定的语句或事务数被写入二进制日志后,MySQL服务器就会将它的二进制日志同步到硬盘上。值为1最安全,因为崩溃时最多丢掉一个语句或事务,但这也是最慢的
  53. sync_binlog = 1
  54. ####################################Innodb设置###################################
  55. # 数据块大小,默认是16k
  56. innodb_page_size = 8192
  57. # InnoDB用来缓存数据和索引的内存缓冲区,一般设置物理存储的60%~70%
  58. innodb_buffer_pool_size = 1G
  59. # CPU多核处理能力设置,假设CPU是2颗4核的,设置如下。读多,写少可以设成2:6的比例
  60. innodb_write_io_threads = 4
  61. innodb_read_io_threads = 4
  62. #提高刷新脏页数量和合并插入数量,改善磁盘I/O处理能力,默认值200(单位:页)
  63. innodb_io_capacity = 500
  64. # 调整buffer pool中最近使用的页读取并dump的百分比,通过设置该参数可以减少转储的page数
  65. innodb_buffer_pool_dump_pct = 40
  66. # 设置redolog文件所在目录
  67. innodb_log_group_home_dir = /opt/mysql/redolog/
  68. # 设置undolog文件所在目录, undolog用于事务回滚操作
  69. innodb_undo_directory = /opt/mysql/undolog/
  70. # 在innodb_log_group_home_dir中的redolog文件数, redolog文件内容是循环覆盖写入。
  71. innodb_log_files_in_group = 3
  72. # 日志组里每个日志文件的大小,值越大在缓冲池中需要检查点刷新的行为就越少,因此越节约磁盘I/O,但更大的日志文件也意味着在崩溃时恢复得更慢
  73. innodb_log_file_size = 1024M
  74. # 设置undolog文件所占空间
  75. innodb_undo_log_truncate = 1
  76. innodb_undo_tablespaces = 3
  77. innodb_undo_logs = 128
  78. # 通过设置配置参数innodb_thread_concurrency来限制并发线程的数量,一旦执行线程数量达到限制,额外的线程在被放置到队列之前,会睡眠数微秒,
  79. # 可以通过设定参数innodb_thread_sleep_delay来配置睡眠时间
  80. innodb_thread_concurrency = 0
  81. # 强所有发生的死锁错误信息记录到error.log中,之前通过命令行只能查看最近一次死锁信息
  82. innodb_print_all_deadlocks = 1

常用脚本

mysqld
mysqld 这个可执行文件就代表着 MySQL 服务器程序,运行这个可执行文件就可以直接启动一个服务器进程。但一般我们不直接使用这个命令。

mysqld_safe
mysqld_safe 是一个启动脚本,它会间接的调用 mysqld ,而且还顺便启动了另外一个监控进程,这个监控进程在服务器进程挂了的时候,可以帮助重启它。另外,使用 mysqld_safe 启动服务器程序时,它会将服务器程序的 出错信息和其他诊断信息重定向到某个文件中,产生出错日志,这样可以方便我们找出发生错误的原因。

mysql.server
这个脚本在 support-files 目录下。它也是一个启动脚本,它会间接的调用 mysqld_safe 脚本,指定 start 参数可以启动服务器程序,指定 stop 参数就可以关闭服务器程序。

客户端连接

bin 目录下有许多客户端程序,比方 mysqladmin、mysqldump、mysqlcheck 等,我们重点关注 mysql 这个可执行文件,通过这个可执行文件可以让我们和服务器程序进程交互,启动命令的格式如下:

  1. ./mysql -h 主机名 -u 用户名 -p

如果你的服务器和客户端安装在同一台机器上,-h 参数可以省略。

常用命令

1. 创建用户

  1. CREATE USER 'username'@'host' IDENTIFIED BY 'password';
  • username:你将创建的用户名
  • host:指定该用户在哪个主机上可以登陆,如果是本地用户可以用 localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符 %
  • password:该用户的登陆密码,如果为空则该用户可以不需要密码登陆服务器

使用示例如下:

  1. CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456';
  2. CREATE USER 'pig'@'192.168.1.101_' IDENDIFIED BY '123456';
  3. CREATE USER 'pig'@'%' IDENTIFIED BY '123456';
  4. CREATE USER 'pig'@'%' IDENTIFIED BY '';
  5. CREATE USER 'pig'@'%';

删除用户的命令如下:

  1. DROP USER 'username'@'host';

2. 授权

  1. GRANT privileges ON databasename.tablename TO 'username'@'host'
  • privileges:用户的操作权限,如 SELECT、INSERT、UPDATE 等,如果要授予所有的权限则使用 ALL
  • databasename:数据库名
  • tablename:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用 表示,如 .*

使用示例如下:

  1. GRANT SELECT, INSERT ON test.user TO 'pig'@'%';
  2. GRANT ALL ON *.* TO 'pig'@'%';

注意:用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,则使用以下命令:

  1. GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;

撤销用户权限的命令如下:

  1. REVOKE privilege ON databasename.tablename FROM 'username'@'host';

3. 修改密码

  1. SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');

如果修改的是当前登陆用户则可使用如下命令:

  1. SET PASSWORD = PASSWORD("newpassword");

使用示例如下:

  1. SET PASSWORD FOR 'pig'@'%' = PASSWORD("123456");

4. 系统变量

查看系统变量:

  1. SHOW VARIABLES [LIKE 匹配的模式]
  2. SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式]

设置系统变量:

  1. SET [GLOBAL|SESSION] 系统变量名=值
  • GLOBAL:全局变量,影响服务器的整体操作。
  • SESSION:会话变量,影响某个客户端连接的操作。注意,SESSION 还有个别名叫 LOCAL。

注意,并不是所有系统变量都具有 GLOBAL 和 SESSION 的作用范围,甚至有些系统变量是只读的,并不能设置值。具体可查阅官方文档。

5. 状态变量

为了让我们更好的了解服务器程序的运行情况,MySQL 服务器程序中维护了好多关于程序运行状态的变量,它们被称为状态变量。比方说 Threads_connected 表示当前有多少客户端与服务器建立了连接。由于状态变量是用来显示服务器程序运行状况的,所以它们的值只能由服务器程序自己来设置。与系统变量类似,状态变量也有 GLOBAL 和 SESSION(默认)两个作用范围的,具体命令如下:

  1. SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式]