[数据库] mysql基础篇-入坑基本功

461 0
Honkers 2026-3-17 23:27:11 来自手机 | 显示全部楼层 |阅读模式

数据库开篇架构

什么是数据?

qq就是mysql

数据存储

很早很早以前,古人是这么存数据的
计算机去存储,管理数据

什么是数据库

        顾名思义,数据库(DB,database)按照数据结构来组织、存储和管理数据的“仓库”,是一个文件或者一组文件。

DBMS

Database Management System,数据库管理系统

数据库管理系统,这一软件用于创建,和,操作数据库,管理,增删改查。

数据库基础知识

运维和数据库

说白了,数据库就是存数据的,是一款软件,用专门的数据库语言,增删改查数据。

数据库在工作里怎么用

数据库和网站

数据库类别

目前主流数据库软件,分为两种

  • 关系型数据库

  • 非关系型数据库

关系型数据库

关系型数据库模型可将复杂的数据结构归结为简单的二元关系(即二维表格形式)

图解数据库概念

什么是表

什么是列 ,什么是行

什么是主键

表创建,字段创建,再去理解

运维要学的了,什么是SQL

什么是mariadb、mysql

目前市面上用的最多的,是mysql 5.7系列 

一些最新的,用于吃螃蟹的公司,用的是mysql8.0


传统行业,mysql更低的版本

或者其他数据库软件如 oracle,sql server等

学习mysql 5.7系列

其他关系型数据库

这里大家只需要了解有该数据库即可

  • Microsoft SQL Server

  • Microsoft Access

  • PostgreSQL

  • DB2

  • Sysbase

  • Informix

数据库具体应用场景

相亲网

譬如网站的注册登录功能,正确流程是,注册成功->可以登录。

工程师就要检测在注册成功后,检查数据库是否正确保留了信息。

游戏数据库

如下是英雄联盟所有的英雄数据库,列出了所有英雄数据

友情提醒

数据库方面知识,主要以运维、开发分为两个方向,不同的方向所重点学习的内容不一样

  • 运维人员,主要是对数据库架构、设计、维护

    • 单实例、多实例

    • SQL语句基础CURD学习、权限管理

    • 字符集、数据库引擎

    • 备份方案

    • 复制方案

    • 高可用方案

  • 开发人员,主要是对数据进行设计、开发

    • 针对业务进行数据库设计、表结构设计

    • 高性能索引

    • 视图

    • 存储过程

    • 函数

mysql基础实践

为什么mysql用的这么多

版本选择

企业版

社区版

        MySQL社区版则是由分散在世界各地的MySQL开发者、爱好者以及用户参与开发与测试的,包括软件代码的管理、测试工作,也是他们在负责。社区也会设立BUG汇报机制,收集用户在使用过程中遇到的BUG情况,相比于企业版,社区版的开发及测试环境没有那么严格。

选哪个

        mysql是成熟产品,企业版和社区版在性能方面区别不大,对于我们学习而言,社区版即可。它们的区别可以如下了解

  • 企业版对代码的管理、测试更严格、稳定性更好

  • 企业版不遵循GPL开源协议,而社区版遵循,可以免费用

  • 企业版可以购买额外的收费服务,如7*24的技术支持,有钱任性。

  • 社区版的安全性,稳定性,无法像企业版有及时的维护、技术支持。

MySQL服务端-客户端

mysql下载选择

了解数据库后,我们可以下载mysql软件了

下载地址:http://mirrors.sohu.com/mysql/

生产环境用哪个版本

mysql安装启动

准备3个新机器,

  • db-51
  • db-52
  • db-53

我们会用到

或者自己快照管

1.安装全流程

  1. yum
  2. 源码编译
  3. rpm包
  4. 装和卸载
  5. 如何处理依赖关系
  6. 都是要掌握的技能
  7. 我这里是省事,二进制解压即用
  8. # 确认时间正确
  9. [root@tech-db-51 /opt]#crontab -l
  10. * * * * * ntpdate -u ntp.aliyun.com
  11. 1 .准备好包
  12. [root@tech-db-51 /opt]#ll
  13. total 707688
  14. -rw-r--r-- 1 root root 724672294 Jul 28 19:56 mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
  15. [root@tech-db-51 /opt]#
  16. [root@tech-db-51 /opt]#
  17. [root@tech-db-51 /opt]#du -h
  18. 692M .
  19. 2. 解压缩,配置PATH
  20. [root@tech-db-51 /opt]## 常见做法,做软连接,便于二进制包的升级,后续的使用路径,用的都是软连接
  21. [root@tech-db-51 /opt]#
  22. [root@tech-db-51 /opt]#
  23. [root@tech-db-51 /opt]#ln -s /opt/mysql-5.7.28-linux-glibc2.12-x86_64 /opt/mysql
  24. [root@tech-db-51 /opt]#
  25. [root@tech-db-51 /opt]#
  26. [root@tech-db-51 /opt]#
  27. [root@tech-db-51 /opt]#ls /opt/ -l
  28. total 707688
  29. lrwxrwxrwx 1 root root 40 Jul 28 19:58 mysql -> /opt/mysql-5.7.28-linux-glibc2.12-x86_64
  30. drwxr-xr-x 9 root root 129 Jul 28 19:57 mysql-5.7.28-linux-glibc2.12-x86_64
  31. -rw-r--r-- 1 root root 724672294 Jul 28 19:56 mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
  32. [root@tech-db-51 /opt]#
  33. # 3. 配置PATH
  34. echo 'export PATH=$PATH:/opt/mysql/bin' >> /etc/profile
  35. source /etc/profile
  36. # 4. 验证mysql版本
  37. [root@tech-db-51 /opt]#mysql -V
  38. mysql Ver 14.14 Distrib 5.7.28, for linux-glibc2.12 (x86_64) using EditLine wrapper
  39. [root@tech-db-51 /opt]#
  40. # 5.删除mariadb的依赖,删除默认的配置文件
  41. yum remove mariadb-libs.x86_64 -y
  42. rm -f /etc/my.cnf
  43. # 6.装mysql5.7特有的依赖包
  44. yum install libaio-devel -y
  45. #7. 创建数据目录,
  46. # 准备mysql的数据目录,授权用户
  47. useradd -s /sbin/nologin -M mysql
  48. mkdir -p /linux0224/
  49. mkdir -p /linux0224/mysql_3306/
  50. # 授权
  51. chown -R mysql.mysql /linux0224/
  52. chown -R mysql.mysql /linux0224/mysql_3306/
  53. chown -R mysql.mysql /opt/mysql*
  54. #检查
  55. ls -ld /linux0224 /linux0224/mysql_3306/ /opt/mysql*
  56. [root@tech-db-51 /opt]#ls -ld /linux0224 /linux0224/mysql_3306/ /opt/mysql*
  57. # 8.此时自建的mysql目录,没有输数据,mysql 无法使用,初始化生成mysql默认库的数据源 ,用户等信息,即可启动
  58. # mysqld 服务端命令,启动,初始化,都用的这个
  59. # --basedir mysql二进制命令装再哪了,主程序目录
  60. # --datadir 数据目录初始到哪
  61. mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql --datadir=/linux0224/mysql_3306/
复制代码

2.配置文件

  1. 初始化完毕后,有配置文件即可正确启动,告诉 my.cnf
  2. mysqld的数据源目录在哪,日志写入到哪等
  3. # /etc/my.cnf 默认mysql会去读这个,不指定,也读这个
  4. # [mysqld] 服务端会读取的配置
  5. # [mysql] 再机器本地,执行mysql命令,客户端读取的配置
  6. # socket 本地进程套接字文件,用于mysql客户端再本地区链接
  7. cat >/etc/my.cnf <<'EOF'
  8. [mysqld]
  9. port=3306
  10. user=mysql
  11. basedir=/opt/mysql
  12. datadir=/linux0224/mysql_3306/
  13. socket=/tmp/mysql.sock
  14. [mysql]
  15. socket=/tmp/mysql.sock
  16. EOF
复制代码

3.启动脚本

  1. 复制自带脚本即可
  2. [root@tech-db-51 /linux0224/mysql_3306]#cp /opt/mysql/support-files/mysql.server /etc/init.d/mysqld
  3. [root@tech-db-51 /linux0224/mysql_3306]#
  4. [root@tech-db-51 /linux0224/mysql_3306]#
  5. [root@tech-db-51 /linux0224/mysql_3306]#systemctl daemon-reload
  6. [root@tech-db-51 /linux0224/mysql_3306]#
  7. [root@tech-db-51 /linux0224/mysql_3306]#
  8. [root@tech-db-51 /linux0224/mysql_3306]#systemctl status mysqld
  9. ● mysqld.service - LSB: start and stop MySQL
  10. Loaded: loaded (/etc/rc.d/init.d/mysqld; bad; vendor preset: disabled)
  11. Active: inactive (dead)
  12. Docs: man:systemd-sysv-generator(8)
复制代码

4.登录mysql

  1. # 启动即可
  2. [root@tech-db-51 /linux0224/mysql_3306]#systemctl start mysqld
  3. [root@tech-db-51 /linux0224/mysql_3306]#
  4. [root@tech-db-51 /linux0224/mysql_3306]#
  5. [root@tech-db-51 /linux0224/mysql_3306]#mysql
  6. Welcome to the MySQL monitor. Commands end with ; or \g.
  7. Your MySQL connection id is 2
  8. Server version: 5.7.28 MySQL Community Server (GPL)
  9. Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
  10. Oracle is a registered trademark of Oracle Corporation and/or its
  11. affiliates. Other names may be trademarks of their respective
  12. owners.
  13. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  14. mysql>
复制代码

mysql多实例管理

MySQL多实例部署

  1. ##创建数据目录
  2. mkdir -p /linux0224/mysql_3307
  3. mkdir -p /linux0224/mysql_3308
  4. chown -R mysql.mysql /linux0224
  5. ###初始化2个实例的数据
  6. mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql --datadir=/linux0224/mysql_3307
  7. mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql --datadir=/linux0224/mysql_3308
  8. # 都会默认创建一个账户,链接权限
  9. root 空密码 只允许再localhost登录
  10. ###至此有3个实例了
  11. [root@tech-db-51 /linux0224]#ll
  12. total 4
  13. drwxr-xr-x 6 mysql mysql 4096 Jul 28 14:00 mysql_3306
  14. drwxr-xr-x 5 mysql mysql 314 Jul 28 14:37 mysql_3307
  15. drwxr-xr-x 5 mysql mysql 314 Jul 28 14:38 mysql_3308
  16. [root@tech-db-51 /linux0224]#
  17. [root@tech-db-51 /linux0224]#du -sh *
  18. 134M mysql_3306
  19. 122M mysql_3307
  20. 122M mysql_3308
  21. #### 额外创建俩实例的配置文件
  22. ### 3306
  23. [root@tech-db-51 /linux0224]#cat /etc/my.cnf
  24. [mysqld]
  25. port=3306
  26. user=mysql
  27. basedir=/opt/mysql
  28. datadir=/linux0224/mysql_3306/
  29. socket=/tmp/mysql.sock
  30. [mysql]
  31. socket=/tmp/mysql.sock
  32. ####### 3307
  33. 区别在参数
  34. port
  35. datadir
  36. socket 进程套接字文件
  37. 链接mysql的俩方式,找到它
  38. 进程
  39. pid
  40. 能链接程序的俩方式
  41. 1. 通过远程网络的链接形式,效率很低,网络波动,
  42. ip:port 10.0.0.51:3306
  43. mysql -uroot -p -h10.0.0.51 -P3306
  44. --------------------------------
  45. --------------------------------
  46. --------------------------------
  47. 2. 通过再机器本地,进程套接字文件去链接,直接是基于内存的链接
  48. 程序和程序之间,直接走内存数据,效率极高,遇见一些软件的部署,走socket链接
  49. 如nginx的反向代理配置
  50. proxy_pass ip:port;
  51. proxy_pass unxi:socket;
  52. /linux0224/mysql_3307/mysql.sock
  53. # -S 等于 -h -P
  54. # 链接3307的进程
  55. # 能看懂 程序链接的2方式
  56. #
  57. mysql -uroot -p密码 -S /linux0224/mysql_3307/mysql.sock
  58. mysql -uroot -p密码 -S /linux0224/mysql_3306/mysql.sock
  59. mysql -uroot -p密码 -S /linux0224/mysql_3308/mysql.sock
  60. #
  61. log目录
  62. cat >/etc/mysql_3307.cnf <<'EOF'
  63. [mysqld]
  64. port=3307
  65. user=mysql
  66. basedir=/opt/mysql/
  67. datadir=/linux0224/mysql_3307/
  68. socket=/linux0224/mysql_3307/mysql.sock
  69. log_error=/linux0224/mysql_3307/mysql.log
  70. EOF
  71. 3308
  72. cat >/etc/mysql_3308.cnf <<'EOF'
  73. [mysqld]
  74. port=3308
  75. user=mysql
  76. basedir=/opt/mysql/
  77. datadir=/linux0224/mysql_3308/
  78. socket=/linux0224/mysql_3308/mysql.sock
  79. log_error=/linux0224/mysql_3308/mysql.log
  80. EOF
  81. ##检查配置文件
  82. [root@tech-db-51 /linux0224]#
  83. [root@tech-db-51 /linux0224]#ls /etc/my*
  84. /etc/my.cnf /etc/mysql_3307.cnf /etc/mysql_3308.cnf
复制代码

多实例脚本

有3个数据目录+ 3个独立的配置文件+ shell脚本 -=====3个运行程序

提供一个脚本模板,自己区分3个实例的端口,数据目录即可

生成 3307 和3308即可

  1. cat > /linux0224/3308.sh <<'EOF'
  2. port="3308"
  3. mysql_user="mysql"
  4. Cmdpath="/opt/mysql/bin/"
  5. # socket用于判断程序是否运行
  6. # 程序运行中,该socket文件存在
  7. # 进程挂了,socket文件自动消失
  8. mysql_sock="/linux0224/mysql_${port}/mysql.sock"
  9. # 定义路径,mysql进程启动后,一个存储该进程pid号码的文件在哪
  10. mysqld_pid_file_path=/linux0224/mysql_${port}/mysqld_${port}.pid
  11. # 启动mysqld服务端的入口命令
  12. start(){
  13. if [ ! -e "$mysql_sock" ];then
  14. printf "Starting MySQL...\n"
  15. # mysql的启动逻辑
  16. # mysqld_safe 脚本 > mysqld 脚本 > 运行mysql进程
  17. /bin/sh ${Cmdpath}/mysqld_safe --defaults-file=/etc/mysql_${port}.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
  18. sleep 3
  19. else
  20. printf "MySQL is running...\n"
  21. exit 1
  22. fi
  23. }
  24. stop(){
  25. if [ ! -e "$mysql_sock" ];then
  26. printf "MySQL is stopped...\n"
  27. exit 1
  28. else
  29. printf "Stoping MySQL...\n"
  30. mysqld_pid=`cat "$mysqld_pid_file_path"`
  31. if (kill -0 $mysqld_pid 2>/dev/null)
  32. then
  33. kill $mysqld_pid
  34. sleep 2
  35. fi
  36. fi
  37. }
  38. restart(){
  39. printf "Restarting MySQL...\n"
  40. stop
  41. sleep 2
  42. start
  43. }
  44. case "$1" in
  45. start)
  46. start
  47. ;;
  48. stop)
  49. stop
  50. ;;
  51. restart)
  52. restart
  53. ;;
  54. *)
  55. printf "Usage: /data/${port}/mysql{start|stop|restart}\n"
  56. esac
  57. EOF
复制代码

启动多实例

  1. # 查看已有的3306实例
  2. [root@tech-db-51 /linux0224]#netstat -tunlp|grep 3306
  3. tcp6 0 0 :::3306 :::* LISTEN 2018/mysqld
  4. # 启动3307
  5. [root@tech-db-51 /linux0224]#bash 3307.sh start
  6. Starting MySQL...
  7. Logging to '/linux0224/mysql_3307/mysql.log'.
  8. [root@tech-db-51 /linux0224]#
  9. [root@tech-db-51 /linux0224]#
  10. [root@tech-db-51 /linux0224]#netstat -tunlp|grep mysql
  11. tcp6 0 0 :::3306 :::* LISTEN 2018/mysqld
  12. tcp6 0 0 :::3307 :::* LISTEN 12514/mysqld
  13. # 启动3308
  14. [root@tech-db-51 /linux0224]#bash 3308.sh start
  15. Starting MySQL...
  16. Logging to '/linux0224/mysql_3308/mysql.log'.
  17. [root@tech-db-51 /linux0224]#
  18. [root@tech-db-51 /linux0224]#netstat -tunlp|grep mysql
  19. tcp6 0 0 :::3306 :::* LISTEN 2018/mysqld
  20. tcp6 0 0 :::3307 :::* LISTEN 12514/mysqld
  21. tcp6 0 0 :::3308 :::* LISTEN 12700/mysqld
复制代码

检查3个实例的pid文件,socket文件

  1. # pid文件 ,3个实例的
  2. [root@tech-db-51 /linux0224]#find . -name '*.pid'
  3. ./mysql_3306/tech-db-51.pid
  4. ./mysql_3307/mysqld_3307.pid
  5. ./mysql_3308/mysqld_3308.pid
  6. #socket文件
复制代码

生产下的暗坑

  1. [root@tech-db-51 /linux0224]#systemctl start mysqld
  2. [root@tech-db-51 /linux0224]#
  3. [root@tech-db-51 /linux0224]#
  4. [root@tech-db-51 /linux0224]#bash /linux0224/3307.sh start
  5. Starting MySQL...
  6. [root@tech-db-51 /linux0224]#
  7. [root@tech-db-51 /linux0224]#
  8. [root@tech-db-51 /linux0224]#find / -name '*.sock' |xargs -i ls -l {}
  9. srwxrwxrwx 1 mysql mysql 0 Jul 28 15:00 /tmp/mysql.sock
  10. srwxrwxrwx 1 mysql mysql 0 Jul 28 15:00 /linux0224/mysql_3307/mysql.sock
  11. srwxrwxrwx 1 mysql mysql 0 Jul 28 14:55 /linux0224/mysql_3308/mysql.sock
  12. [root@tech-db-51 /linux0224]#
  13. 有些程序,不专业的程序员,会清空/tmp下的数据
  14. # mysql的链接有的链接方式是走 sock文件的,因此sock文件不得删除,导致无法链接
  15. # 建议,sock文件,别放入/tmp目录
复制代码

设置多实例的密码

  1. 3实例,
  2. # mysqladmin和mysql一样,也是客户端链接命令
  3. # 精确定位 每一个实例
  4. # ip:port
  5. # socket
  6. mysqladmin -uroot -p password 新的密码
  7. # ==================3306=========
  8. # socket修改
  9. # -u账户
  10. # -p密码 ,啥也没写,会交互式提示让你输入
  11. mysqladmin -uroot -p -S /tmp/mysql.sock password linux0224
  12. # 还要再改3306的密码
  13. # -p后面建议别跟上密码,因为history能看到密码记录
  14. # mysql也给你提示不安全
  15. mysqladmin -uroot -plinux0224 -S /tmp/mysql.sock password linux3306
  16. # ==================3307=========
  17. mysqladmin -uroot -p -S /linux0224/mysql_3307/mysql.sock password linux3307
  18. # ==================3308=========
  19. mysqladmin -uroot -p -S /linux0224/mysql_3308/mysql.sock password linux3308
复制代码

登录多实例

ip:port方式

  1. [root@tech-db-51 /linux0224]#mysql -hlocalhost -P3306 -uroot -plinux3306 -e "show global variables like 'port';"
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. +---------------+-------+
  4. | Variable_name | Value |
  5. +---------------+-------+
  6. | port | 3306 |
  7. +---------------+-------+
  8. # 3307 ,mysql的用户远程链接,权限问题
  9. [root@tech-db-51 /linux0224]#mysql -uroot -plinux3307 -h127.0.0.1 -P3307 -e "show global variables like 'port';"
  10. mysql: [Warning] Using a password on the command line interface can be insecure.
  11. +---------------+-------+
  12. | Variable_name | Value |
  13. +---------------+-------+
  14. | port | 3307 |
  15. +---------------+-------+
  16. [root@tech-db-51 /linux0224]#mysql -uroot -plinux3308 -h127.0.0.1 -P3308 -e "show global variables like 'port';"
  17. mysql: [Warning] Using a password on the command line interface can be insecure.
  18. +---------------+-------+
  19. | Variable_name | Value |
  20. +---------------+-------+
  21. | port | 3308 |
  22. +---------------+-------+
  23. # ip:port有很多种规则
  24. # 授权语法
  25. # locahost, 127.0.0.1 10.0.0.10
复制代码

sock文件方式

  1. mysql -uroot -plinux3308 -S /linux0224/mysql_3308/mysql.sock -e "show global variables like 'port';"
  2. mysql -uroot -plinux3307 -S /linux0224/mysql_3307/mysql.sock -e "show global variables like 'port';"
  3. mysql -uroot -plinux3306 -S /tmp/mysql.sock -e "show global variables like 'port';"
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行