Mysql介绍及安装

1 数据库的介绍

1.1 什么是数据库

数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构上指数据的组织形式或数据之间的联系)来组织、存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据。

1.2 数据的种类

数据库一共分为三大类,分别为层次式数据库、网络式数据库和关系型数据库。这里我们主要关注的是关系型数据库和非关系型数据库(NOSQL)两种。

1.2.1 关系型数据库介绍

1)关系型数据库我的理解是二元关系(即二维表格的形式)

2)Mysql和Oracle数据库,运维里面最常用的是Mysql

3)通过sql查询语句存储数据

4)保持数据一致性方面很强

1.2.2 非关系型数据库介绍

非关系型数据库也被称为NOSQL数据库,这里的NOSQL的本意是“not only sql”,指的是非关系性数据库。

1)NOSQL不是否定关系型数据库,而是作为关系数据库的一个重要补充

2)NOSQL为了高性能和高并发而生

3)NOSQL典型产品是Memcached、Redis、Mongodb等

补充:

1、面向高性能并发读写的key-value数据库:key-value数据库的主要特点即使具有极高的并发读写性能:代表Redis

2、面向海量数据访问的文档型数据库:这类数据库特点是可以在海量的数据中快速的查询数据,典型代表为MongoDB

3、面向可扩展性的分布式数据库:这类数据库想解决的问题就是传统数据库存在可扩展性上的缺陷,典型代表为Cassandra等

1.2.3 非关系型数据库种类

键值存储数据库

键值数据库就类似传统语言中使用的哈希表。可以通过key来添加、查询或者删除数据,因为使用key主键访问,所以会获得很高的性能及扩展性。

键值数据库主要是使用一个哈希表,这个表中有一个特定的键和一个指证指向特定的数据。Key/value模型对于it系统来说的优势在于简单、易部署、高并发

1.2.4 Redis特点

1)支持内存缓存,这个功能相当于memcahed

2)支持持久化存储,这个功能相当于memcachedb,ttserver

3)数据库类型更丰富

4)支持主从集群,分布式

5)支持队列等特殊功能

1.3 Mysql数据库介绍

Mysql数据库是互联网领域里一款最重要的、深受广大用户欢迎的开源关系型数据库软件之一,它是一种关系类型数据库管理系统,关系型数据库的特点是将数据库保存在不同的表中,在将这些表放入不同的数据库中,而不是将所有的书统一放在一个大仓库里,这样的设计增加了mysql的读取速度,灵活可管理性也得到了很大提高,访问以及管理mysql数据库的最常用标准化语言为sql查询语言。

1.3.1 Mysql数据库的特点

1)Mysql性能卓越,服务稳定,很少会出现异常宕机

2)Mysql开放源代码且无版权制约,自主性以及使用成本低

3)Mysql历史悠久,社区活跃,遇到问题,可以快速的找到帮助

2 Mysql二进制安装

  1. 1、下载并上传软件至/usr/local/src
  2. [root@mysql-36 ~]# cd /usr/local/src
  3. [root@mysql-36 src]# ls
  4. mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
  5. 2、解压软件
  6. [root@mysql-36 src]# tar xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
  7. [root@mysql-36 src]# mv mysql-5.7.31-linux-glibc2.12-x86_64 ../mysql-5.7.31
  8. [root@mysql-36 src]# cd ..
  9. [root@mysql-36 local]# ln -s mysql-5.7.31/ mysql
  10. 3、用户的创建处理原始环境
  11. [root@mysql-36 ~]# yum remove mariadb-libs-5.5.60-1.el7_5.x86_64 -y
  12. [root@mysql-36 ~]# rpm -qa |grep mariadb
  13. [root@mysql-36 ~]# useradd -s /sbin/nologin mysql
  14. 4、设置环境变量
  15. vim /etc/profile
  16. export PATH=/usr/local/mysql/bin:$PATH
  17. [root@mysql-36 ~]# source /etc/profile
  18. [root@mysql-36 ~]# mysql -V
  19. mysql Ver 14.14 Distrib 5.7.31, for linux-glibc2.12 (x86_64) using EditLine wrapper
  20. 5、创建数据路径并授权
  21. 添加一块新磁盘模拟数据盘
  22. 格式化并挂载磁盘
  23. [root@mysql-36 ~]# mkfs.xfs /dev/sdb
  24. [root@mysql-36 ~]# mkdir /data
  25. [root@mysql-36 ~]# blkid
  26. [root@mysql-36 ~]# vim /etc/fstab
  27. UUID=7dfc98e4-6ab0-450e-adc6-c26fe729e6e0 /data xfs defaults 0 0
  28. [root@mysql-36 ~]# mount -a
  29. [root@mysql-36 local]# df -h
  30. 文件系统 容量 已用 可用 已用% 挂载点
  31. /dev/sda3 17G 2.9G 15G 17% /
  32. devtmpfs 903M 0 903M 0% /dev
  33. tmpfs 912M 0 912M 0% /dev/shm
  34. tmpfs 912M 8.6M 904M 1% /run
  35. tmpfs 912M 0 912M 0% /sys/fs/cgroup
  36. /dev/sdb1 10G 166M 9.9G 2% /data
  37. /dev/sda1 1014M 135M 880M 14% /boot
  38. tmpfs 183M 0 183M 0% /run/user/0
  39. 授权
  40. chown -R mysql.mysql /usr/local/mysql/*
  41. chown -R mysql.mysql /data
  42. 6、初始化数据(创建系统数据)
  43. [root@mysql-36 ~]# mkdir /data/mysql/data -p
  44. [root@mysql-36 ~]# chown -R mysql.mysql /data
  45. [root@mysql-36 ~]# mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/data
  46. 说明:
  47. --initialize 参数:
  48. 1. 对于密码复杂度进行定制:12位,4种
  49. 2. 密码过期时间:180天
  50. 3. 给root@localhost用户设置临时密码
  51. 报错:
  52. mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
  53. 解决:
  54. [root@mysql-36 ~]# yum install -y libaio-devel
  55. [root@mysql-36 ~]# mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/data
  56. 2019-06-13T04:21:27.706564Z 1 [Note] A temporary password is generated for root@localhost: =mrV)_16is4U
  57. --initialize-insecure 参数:
  58. 无限制,无临时密码
  59. [root@mysql-36 /data/mysql/data]# \rm -rf /data/mysql/data/*
  60. [root@mysql-36 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/data
  61. 7、配置文件的准备
  62. cat >/etc/my.cnf <<EOF
  63. [mysqld]
  64. user=mysql
  65. basedir=/usr/local/mysql
  66. datadir=/data/mysql/data
  67. socket=/tmp/mysql.sock
  68. server_id=6
  69. port=3306
  70. [mysql]
  71. socket=/tmp/mysql.sock
  72. EOF
  73. 8、启动数据库
  74. 第一种:用service
  75. [root@mysql-36 /etc/init.d]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
  76. [root@mysql-36 /etc/init.d]# service mysqld restart
  77. 第二种:用systemd
  78. 注意: sysv方式启动过的话,需要先提前关闭,才能以下方式登录
  79. cat >/etc/systemd/system/mysqld.service <<EOF
  80. [Unit]
  81. Description=MySQL Server
  82. Documentation=man:mysqld(8)
  83. Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
  84. After=network.target
  85. After=syslog.target
  86. [Install]
  87. WantedBy=multi-user.target
  88. [Service]
  89. User=mysql
  90. Group=mysql
  91. ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
  92. LimitNOFILE = 5000
  93. EOF
  94. [root@mysql-36 local]# systemctl enable mysqld
  95. [root@mysql-36 local]# systemctl start mysqld
  96. 9、登录数据库,修改密码
  97. [root@mysql-36 ~]# mysql
  98. mysql> alter user 'root'@'localhost' identified by '123456';
  99. mysql> flush privileges;

2.1 Mysql的启动和关闭

image-20210405152937844.png

  1. 1Mysql正常的启动和停止
  2. centos6或者7
  3. /etc/init.d/mysqld start|stop|status
  4. centos7:
  5. systemctl start mysqld #启动mysql
  6. systemctl stop mysqld #停止mysql
  7. systemctl restart mysqld #重启mysql
  8. 2、维护性的任务或者测试
  9. 我们偶尔会有维护性的任务或者测试的时候,可以使用mysqld_safe
  10. [root@db01 ~]# mysqld_safe & #后台启动mysql
  11. 当然我们也可以加一些参数来运行,比如破密码:
  12. mysqld_safe --skip-grant-tables --skip-networking &
  13. 当然这个也会读取/etc/my.cnf的内容,但是如果冲突,命令行优先级最高

2.2 Mysql初始化配置

  1. 用于控制Mysql的启动
  2. 影响到客户端的连接

2.2.1 初始化配置的方法

  1. 1、通过预编译的方式来初始化配置
  2. 2、通过配置文件的方式来初始化配置
  3. 3、命令行参数(仅限于mysqld_safe

2.2.2 初始配置文件

  1. #1、初始化配置文件的默认读取路径
  2. [root@db01 ~]# mysqld --help --verbose |grep my.cnf
  3. /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
  4. 注:
  5. 默认情况下,MySQL启动时,会依次读取以上配置文件,如果有重复选项,会以最后一个文件设置的为准。
  6. 但是,如果启动时加入了--defaults-file=xxxx时,以上的所有文件都不会读取
  7. #2、配置文件的书写方式
  8. [标签]
  9. 配置项=xxxx
  10. 标签类型:服务端、客户端
  11. 服务器端标签:
  12. [mysqld]
  13. [mysqld_safe]
  14. [server]
  15. 客户端标签:
  16. [mysql]
  17. [mysqldump]
  18. [client]
  19. 配置文件的示例展示:
  20. [root@db01 ~]# cat /etc/my.cnf
  21. [mysqld]
  22. user=mysql
  23. basedir=/app/mysql
  24. datadir=/data/mysql
  25. socket=/tmp/mysql.sock
  26. server_id=6
  27. port=3306
  28. log_error=/data/mysql/mysql.log
  29. [mysql]
  30. socket=/tmp/mysql.sock

2.3 Mysql客户端命令

  1. mysql常用参数:
  2. -u 用户名,默认为root
  3. -p 用户密码,建议使用-p,默认为空密码
  4. -h 服务器主机,默认为localhost
  5. -P 服务器端口
  6. -S socket文件所在的路径
  7. -e 免交互执行命令
  8. -D 指定默认数据库
  9. < 导入SQL脚本
  10. [root@db01 ~]# mysql -uroot -p -h 10.0.0.51 -P3306
  11. Enter password:
  12. mysql> select @@socket;
  13. +-----------------+
  14. | @@socket |
  15. +-----------------+
  16. | /tmp/mysql.sock |
  17. [root@db01 ~]# mysql -uroot -p -S /tmp/mysql.sock
  18. Enter password:
  19. [root@db01 ~]# mysql -uroot -p -e "select user,host from mysql.user;"
  20. Enter password:
  21. +---------------+-----------+
  22. | user | host |
  23. +---------------+-----------+
  24. | abc | 10.0.0.% |
  25. | app | 10.0.0.% |
  26. | root | 10.0.0.% |
  27. | mysql.session | localhost |
  28. | mysql.sys | localhost |
  29. | root | localhost |
  30. +---------------+-----------+
  31. [root@db01 ~]# mysql -uroot -p < world.sql
  32. Enter password:

3 Mysql修改密码和忘记密码怎么办?

  1. 1、管理员密码的设定(root@localhost
  2. [root@mysql-36 ~]# mysqladmin -uroot -p password oldboy123
  3. Enter password:
  4. 2、管理员用户密码忘记了?
  5. --skip-grant-tables #跳过授权表
  6. --skip-networking #跳过远程登录,只允许本地访问,这个是为了安全起见
  7. 2.1、关闭数据库
  8. [root@mysql-36 ~]# systemctl stop mysqld
  9. 2.2、启动数据库到维护模式
  10. [root@mysql-36 ~]# mysqld_safe --skip-grant-tables --skip-networking &
  11. 2.3、登录并修改密码
  12. [root@mysql-36 ~]# mysql
  13. mysql> alter user root@'localhost' identified by '123456';
  14. ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
  15. mysql> flush privileges;
  16. Query OK, 0 rows affected (0.00 sec)
  17. mysql> alter user root@'localhost' identified by '123456';
  18. Query OK, 0 rows affected (0.00 sec)
  19. mysql> quit
  20. 2.4、关闭数据库,正常启动验证
  21. [root@mysql-36 ~]# systemctl start mysqld
  22. [root@mysql-36 ~]# mysql -uroot -p123456
  23. mysql>
  24. mysql5.7密码方面的新特性:
  25. 1.初始化完成后,会生成临时密码(显示到屏幕上,并且会往日志中记一份)
  26. 2.密码复杂度:长度:超过12 复杂度:字符混乱组合
  27. 3.密码过期时间180
  28. mysqladmin命令
  29. mysqladmin -uroot -p123456 ping #查看mysql服务是否正常,如果正常提示mysqld is alive
  30. mysqladmin -uroot -p123456 shutdown #关闭mysql服务,但mysqladmin命令无法开启
  31. mysqladmin -uroot -p123456 password 123 #修改密码

4 Mysql安全配置向导

安装完mysql-server 会提示可以运行mysql_secure_installation。运行mysql_secure_installation会执行几个设置:

  • 为root用户设置密码
  • 删除匿名账号
  • 取消root用户远程登录
  • 删除test库和对test库的访问权限
  • 刷新授权表使修改生效

通过以上几项可以提高Mysql的安全性,建议生产环境运行这个命令,具体操作如下:

  1. [root@localhost ~]# mysql_secure_installation
  2. NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
  3. SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
  4. .....
  5. Enter current password for root (enter for none):<-初次运行直接回车
  6. OK, successfully used password, moving on
  7. Setting the root password ensures that nobody can log into the MySQL
  8. root user without the proper authorisation.
  9. Set root password? [Y/n] #是否设置root用户密码,输入y并回车或直接回车
  10. New password: #设置root用户的密码
  11. Re-enter new password: #再输入一次你设置的密码
  12. Password updated successfully!
  13. Reloading privilege tables..
  14. Success!
  15. By default, a MySQL installation has an anonymous user, allowing anyone
  16. to log into MySQL without having to have a user account created for
  17. them. This is intended only for testing, and to make the installation
  18. go a bit smoother. You should remove them before moving into a
  19. production environment.
  20. Remove anonymous users? [Y/n] #是否删除匿名用户,生产环境建议删除,所以直接回车
  21. Success!
  22. Normally, root should only be allowed to connect from localhostThis
  23. ensures that someone cannot guess at the root password from the network.
  24. Disallow root login remotely? [Y/n] #是否禁止root远程登录,根据自己的需求选择Y/n并回车,建议禁止
  25. Success!
  26. By default, MySQL comes with a database named test that anyone can
  27. access. This is also intended only for testing, and should be removed
  28. before moving into a production environment.
  29. Remove test database and access to it? [Y/n] #是否删除test数据库,直接回车
  30. - Dropping test database
  31. Success!
  32. - Removing privileges on test database
  33. Success!
  34. Reloading the privilege tables will ensure that all changes made so far
  35. will take effect immediately.
  36. Reload privilege tables now? [Y/n] #是否重新加载权限表,直接回车
  37. Success!
  38. Cleaning up
  39. All done! If you've completed all of the above steps, your MySQL
  40. installation should now be secure.
  41. Thanks for using MySQL!

5 Mysql多实例安装

  1. 4.1 准备多个目录
  2. mkdir -p /data/330{7,8,9}/data
  3. 4.2 准备配置文件
  4. cat > /data/3307/my.cnf <<EOF
  5. [mysqld]
  6. basedir=/usr/local/mysql
  7. datadir=/data/3307/data
  8. socket=/data/3307/data/mysql.sock
  9. log_error=/data/3307/mysql.log
  10. port=3307
  11. server_id=7
  12. log_bin=/data/3307/mysql-bin
  13. EOF
  14. cat > /data/3308/my.cnf <<EOF
  15. [mysqld]
  16. basedir=/usr/local/mysql
  17. datadir=/data/3308/data
  18. socket=/data/3308/data/mysql.sock
  19. log_error=/data/3308/mysql.log
  20. port=3308
  21. server_id=8
  22. log_bin=/data/3308/mysql-bin
  23. EOF
  24. cat > /data/3309/my.cnf <<EOF
  25. [mysqld]
  26. basedir=/usr/local/mysql
  27. datadir=/data/3309/data
  28. socket=/data/3309/data/mysql.sock
  29. log_error=/data/3309/mysql.log
  30. port=3309
  31. server_id=9
  32. log_bin=/data/3309/mysql-bin
  33. EOF
  34. 4.3 初始化三套数据
  35. mv /etc/my.cnf /etc/my.cnf.bak
  36. mysqld --initialize-insecure --user=mysql --datadir=/data/3307/data --basedir=/usr/local/mysql
  37. mysqld --initialize-insecure --user=mysql --datadir=/data/3308/data --basedir=/usr/local/mysql
  38. mysqld --initialize-insecure --user=mysql --datadir=/data/3309/data --basedir=/usr/local/mysql
  39. 4.4 systemd管理多实例
  40. cd /etc/systemd/system
  41. cp mysqld.service mysqld3307.service
  42. cp mysqld.service mysqld3308.service
  43. cp mysqld.service mysqld3309.service
  44. vim mysqld3307.service
  45. # 修改为:
  46. ExecStart=/application/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
  47. vim mysqld3308.service
  48. # 修改为:
  49. ExecStart=/application/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf
  50. vim mysqld3309.service
  51. # 修改为:
  52. ExecStart=/application/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf
  53. 4.5 授权
  54. chown -R mysql.mysql /data/*
  55. 4.6 启动
  56. systemctl start mysqld3307.service
  57. systemctl start mysqld3308.service
  58. systemctl start mysqld3309.service
  59. 4.7 验证多实例
  60. netstat -lnp|grep 330
  61. mysql -uroot -S /data/3307/data/mysql.sock
  62. mysql -uroot -S /data/3308/data/mysql.sock
  63. mysql -uroot -S /data/3309/data/mysql.sock