传统数据库

上篇文章:聊聊数据库~开篇 https://www.cnblogs.com/dotnetcrazy/p/9690466.html

本来准备直接开讲NoSQL的(当时开篇就是说的NoSQL)考虑到有些同志可能连MySQL系都没接触过,所以我们2019说数据系的时候预计从MySQL(穿插MSSQL)开始,这篇文章就当试水篇,效果好就继续往下写~(这篇偏理论和运维)

1.1.MariaDB and MySQL

官方文档:https://mariadb.com/kb/zh-cn/mariadb

目前主流:MySQL 5.7 or MariaDB 5.5.x(推荐)

多一句嘴,MySQL当年被Oracle收购后,MySQL之父觉得靠Oracle维护MySQL很不靠谱,然后就跳槽弄了个MariaDB(很多Oracle竞争对手扶持着),目前MariaDB是发展最快的MySQL分支版本(PS:MySQL现在是双协议了,大部分公司用的版本都是<=5.7

然后得说下迁移问题:MySQL 5.xMariaDB 5.x基本上是无缝的,MariaDB最新稳定版为:MariaDB 5.5

PS:MariaDB有两个分支,而10.x分支是不兼容MySQL的

MariaDBMySQL兼容性可以查看:

https://mariadb.com/kb/zh-cn/mariadb-vs-mysql-compatibility/

PS:国内比较火的还有阿里的MySQL分支https://github.com/alibaba/AliSQL

不谈其他的,咱们看看它们开发的积极程度就知道为什么MariaDB是主流了

使用概括(推荐)

如果想要使用MariaDB10.x的同志可以考虑MySQL8.x(社区完善)

如果想要使用MySQL5.x的同志可以考虑MariaDB5.5.x(高性能且兼容)

1.2.MariaDB部署

网络配置如果不会可以看我以前写的文章:https://www.cnblogs.com/dunitian/p/6658578.html

1.环境配置和初始化

安装很简单,以CentOS为例:

systemctl start mariadb.service   # 启动MariaDB
systemctl enable mariadb.service # 设置开机启动 systemctl stop mariadb.service # 停止MariaDB
systemctl restart mariadb.service # 重启MariaDB

PS:Win安装注意这一步:

执行文件简单说明:有时候我们 ps aux | grep mysql 的时候,发现运行的并不是/usr/bin/下的mysqld而是mysqld_safe,那这个mysqld_safe是啥呢?==> 线程安全的实例

MariaDB的程序组成:ls /usr/bin | grep mysql

  1. Client:

    • mysql 命令行客户端
    • mysqldump 数据库备份用
    • mysqladmin 远程管理工具
    • mysqlbinlog 二进制日志管理工具
    • ...
  2. Server:
    • mysqld_safe 线程安全的实例
    • mysqld_multi 多实例
    • mysqld
    • mysql_secure_installation 安全初始化工具(记得先启动数据库哦)
    • ...

mysql的账号由两部分组成:username@host,MySQL客户端连接参数:

  • -u用户名--user,默认为root
  • -h服务器主机--host,默认为localhost
    • host用于限制用户可以通过哪些主机连接
    • 支持通配符:
      • %匹配任意长度的任意字符:172.16.0.0/16 ==> 172.16.%.%
      • _匹配任意单个字符
  • -p密码--password,默认为
    • 安装完成后运行mysql_secure_installation来设置密码并初始化
  • other:
    • -P--port,指定端口
    • -D--database,指定数据库
    • -C--compress,连接数据库的时候对传输的数据压缩
    • -S--socket,指定socket文件
  • MySQL专用:-e "SQL语句",直接执行SQL语句
    • mysql -e "show databases"(脚本直接运行)

很多人安装完成后是这样设置密码的:(不推荐)

正确打开方式:mysql_secure_installation

如果允许root远程登录:Disallow root login remotely? [Y/n] n

安全初始化后登录图示:



2.配置文件

MariaDB 5.5.60为例:

  1. Linux:配置文件查找顺序(找不到就往下继续)

    • /etc/my.cnf --> /etc/mysql/conf.d/*.cnf --> ~/.my.cnf
  2. Windows:MariaDB安装目录/data/my.ini

PS:一般配置文件都会设置这3个

[mysqld]
# 独立表空间: 每一个表都有一个.frm表描述文件,还有一个.ibd文件
innodb_file_per_table=on
# 不对连接进行DNS解析(省时)
skip_name_resolve=on
# 配置sql_mode
sql_mode='strict_trans_tables' # 指定数据库文件存放路径
# datadir=/mysql/data
# socket=/mysql/data/mysql.sock # 与之对应

其他配置MariaDB提供了样本:

[dnt@localhost ~] ls /usr/share/mysql/ | grep .cnf
my-huge.cnf # 超大内存配置参考
my-innodb-heavy-4G.cnf # 4G内存配置参考
my-large.cnf # 大内存配置
my-medium.cnf # 中等内存配置
my-small.cnf # 小内存配置

PS:thread_concurrency=CPU数*2最佳,修改配置后记得重启数据库

3.远程访问

1.之前安全初始化的时候把root禁止远程登录了,现在我们创建一个其他用户

2.给用户权限

3.防火墙放行指定端口

4.远程客户端测试一下

Code如下:

# root账户登录
mysql -uroot -p # 新增用户
insert into mysql.user(user,host,password) values("用户名","%",password("密码")); # 刷新设置
flush privileges; # 分配权限
grant all privileges on 数据库.* to 用户名@"%" identified by "密码"; # 刷新设置
flush privileges; # 显示服务状态
systemctl status firewalld # 添加 --permanent永久生效(没有此参数重启后失效)
firewall-cmd --zone=public --add-port=3306/tcp --permanent # 重新载入
firewall-cmd --reload # 查看
firewall-cmd --zone= public --query-port=3306/tcp
# 删除
firewall-cmd --zone= public --remove-port=3306/tcp --permanent

SQLServer远程连接https://www.cnblogs.com/dunitian/p/5474501.html

扩展:为用户添加新数据库的权限

PS:先使用root创建数据库,然后再授权grant all privileges on 数据库.* to 用户名@"%" identified by "密码";并刷新flush privileges;

查看权限:show grants for dnt;

效果:

1.3.MySQL部署

之前有园友说,为啥不顺便说说UbuntuServer的部署呢?呃。。。一般来说公司服务器都是CentOS的占大多数,然后UbuntuServer更多的是个人云服务比较多(推荐初创公司使用),毕竟它们两个系统追求的不太一样,一个是追求稳(部署麻烦),一个是追求软件尽量新的情况下稳定(更新太快)

那么长话短说,步入正轨:

1.Ubuntu最常见的包问题

Ubuntu不得不说的就是这个apt出问题的处理 :(换源就不说了/etc/apt/sources.list

# 一般删除这几个锁文件,然后再重新配置下就可以了
sudo rm /var/lib/dpkg/lock
sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
# 简写(千万注意空格,不然你就是rm -rf / + 跑路了)
# sudo rm /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock /var/lib/dpkg/lock-frontend # 重新配置下
sudo dpkg --configure -a

2.安装注意(Ubuntu的特点就是使用起来简单)

Ubuntu推荐使用MySQL(毕竟同是5.x用起来基本上差不多,安装过程和之前说的CentOS 下 MariaDB差不多,所有命令前加个sudo

1.安装比较简单:sudo apt install mysql-server -y

2.允许远程连接:注释掉 bind-address=127.0.0.1(/etc/mysql/mysql.conf.d/mysqld.cnf)

PS:常用配置(/etc/mysql/mysql.conf.d/mysqld.cnf

3.关于为什么是这个路径的说明:sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

4.所有配置修改都需要重新启动下:sudo systemctl restart mysql

5.第一次初始化和MariaDB不太一样:sudo mysql_secure_installation(其他一路y即可)

需要选下你设置root密码的复杂度:(一般1就可以了,就算设置再复杂,入了系统也是虚的)

PS:可以看看拓展文章:Ubuntu16安装mysql5.7未提示输入密码,安装后修改mysql默认密码【不推荐】修改mysql密码策略

6.然后输入密码你就可以登录了sudo mysql -uroot -p(PS:你直接sudo mysql也可以直接登录)

这边我就不像上节课一步步演示了,直接授权和创建一步走了grant all privileges on 数据库.* to "用户名"@"%" identified by "复杂密码";

7.记得flush privileges;刷新一下系统表

课后拓展:

MySQL5.7.26 忘记Root密码小计:https://www.cnblogs.com/dotnetcrazy/p/11027732.html

浅析MySQL 8忘记密码处理方式
https://www.cnblogs.com/wangjiming/p/10363357.html MySQL5.6更改datadir数据存储目录
https://www.cnblogs.com/ding2016/p/7644675.html

扩展:CentOS7安装MySQL8

CentOS7安装MySQL8.0安装小计https://mp.weixin.qq.com/s/Su3Ivuy5IMeAwYBXaka0ag


MySQL军规(58)

文章结尾贴一节58MySQL军规:(适用于并发量大,数据量大的典型互联网业务

1.基础规范

  1. 表存储引擎必须使用InnoDB
  2. 表字符集默认使用utf8,必要时候使用utf8mb4
    • utf8通用,无乱码风险,汉字3字节,英文1字节
    • utf8mb4utf8的超集,存储4字节时使用(eg:表情符号)
  3. 禁止使用存储过程,视图,触发器,Event
    • 调试,排错,迁移都比较困难,扩展性较差
    • 对数据库性能影响较大,互联网业务,能让站点层和服务层干的事情,不要交到数据库层
  4. 禁止在数据库中存储大文件(eg:照片)
    • 可以将大文件存储在对象存储系统,数据库中存储路径
  5. 禁止在线上环境做数据库压力测试
    • 测试,开发,线上数据库环境必须隔离

2.命名规范

  1. 库名,表名,列名必须用小写,采用下划线分隔

    • abc,Abc,ABC都是给自己埋坑
  2. 库名,表名,列名必须见名知义,长度不要超过32字符
    • tmp,wushan谁TM知道这些库是干嘛的
  3. 库备份必须以bak为前缀,以日期为后缀
    • 从库必须以-s为后缀
    • 备库必须以-ss为后缀

3.表设计规范

  1. 单实例表个数必须控制在2000个以内
  2. 单表分表个数必须控制在1024个以内
  3. 表必须有主键,推荐使用unsigned整数为主键
    • 潜在坑:删除无主键的表,如果是row模式的主从架构,从库会挂住
  4. 禁止使用外键,如果要保证完整性,应由应用程式实现
    • 外键使得表之间相互耦合,影响update/delete等SQL性能
    • 有可能造成死锁,高并发情况下容易成为数据库瓶颈
  5. 建议将大字段,访问频度低的字段拆分到单独的表中存储,分离冷热数据
    • 垂直拆分的依据,尽量把长度较短,访问频率较高的属性放在主表里
    • 流量大数据量大时,数据访问要有service层,并且service层不要通过join来获取主表和扩展表的属性
    • 具体可以参考沈剑大牛写的《如何实施数据库垂直拆分》

4.列设计规范

  1. 根据业务区分使用tinyint/int/bigint,分别会占用1/4/8字节
  2. 根据业务区分使用char/varchar(PS:没有MSSQL里的nvarchar
    • 字段长度固定,或者长度近似的业务场景,适合使用char能够减少碎片,查询性能高
    • 字段长度相差较大,或者更新较少的业务场景,适合使用varchar,能够减少空间
  3. 根据业务区分使用datetime/timestamp
    • datetime占用5个字节,timestamp占用4个字节
    • 存储年使用year,存储日期使用date,存储时间使用datetime
  4. 必须把字段定义为NOT NULL并设默认值
    • NULL需要更多的存储空间
    • NULL的列使用索引,索引统计,值都更加复杂,MySQL更难优化
    • NULL只能采用IS NULL或者IS NOT NULL,而在=/!=/in/not in时有大坑
  5. 使用int unsigned存储IPv4,不要用char(15)
  6. 使用varchar(20)存储手机号,不要使用整数
    • 手机号不会用来做数学运算
    • varchar可以模糊查询(eg:like ‘138%’)
    • 牵扯到国家代号,可能出现+、-、()等字符,eg:+86
  7. 使用tinyint来代替enum
    • enum增加新值要进行DDL操作

5.索引规范(常用)

  1. 唯一索引使用uniq_字段名来命名(uq_表名_字段名
  2. 非唯一索引使用idx_字段名来命名(ix_表名_字段名
  3. 单张表索引数量建议控制在5个以内
    • 互联网高并发业务,太多索引会影响写性能
    • 异常复杂的查询需求,可以选择ES等更为适合的方式存储
    • 生成执行计划时,如果索引太多,会降低性能,并可能导致MySQL选择不到最优索引
  4. 组合索引字段数不建议超过5个
    • 如果5个字段还不能极大缩小row范围,八成是设计有问题
  5. 不建议在频繁更新的字段上建立索引
  6. 尽量不要join查询,如果要进行join查询,被join的字段必须类型相同,并建立索引
    • join字段类型不一致容易导致全表扫描
  7. 理解组合索引最左前缀原则,避免重复建设索引
    • 如果建立了(a,b,c),相当于建立了(a), (a,b), (a,b,c)

6.SQL规范(常用)

  1. 禁止使用select *,只获取必要字段

    • 指定字段能有效利用索引覆盖
    • select *会增加cpu/io/内存/带宽的消耗
    • 指定字段查询,在表结构变更时,能保证对应用程序无影响
  2. insert必须指定字段,禁止使用insert into T values()
    • 指定字段插入,在表结构变更时,能保证对应用程序无影响
  3. 隐式类型转换会使索引失效,导致全表扫描(很重要)
  4. 禁止在where条件列使用函数或者表达式
    • 导致不能命中索引,全表扫描
  5. 禁止负向查询以及%开头的模糊查询
    • 导致不能命中索引,全表扫描
  6. 禁止大表join子查询
  7. 同一个字段上的or必须改写为inin的值必须少于50个
  8. 应用程序必须捕获SQL异常(方便定位线上问题)

课后思考:为什么select uid from user where phone=13811223344不能命中phone索引?

课后拓展:

MyISAM与InnoDB两者之间区别与选择
https://www.cnblogs.com/y-rong/p/5309392.html
https://www.cnblogs.com/y-rong/p/8110596.html 了解下Mysql的间隙锁及产生的原因
https://www.cnblogs.com/wt645631686/p/8324671.html grant授权和revoke回收权限
https://www.cnblogs.com/kevingrace/p/5719536.html centos7自带数据库MariaDB重启和修改密码
https://blog.csdn.net/shachao888/article/details/50341857 MySQL添加用户、删除用户与授权
https://www.cnblogs.com/wanghetao/p/3806888.html 深度认识 Sharding-JDBC:做最轻量级的数据库中间层
https://my.oschina.net/editorial-story/blog/888650

聊聊数据库~2.SQL环境篇的更多相关文章

  1. 聊聊数据库~3.SQL基础篇

    上篇回顾:聊聊数据库~SQL环境篇 扩展:为用户添加新数据库的权限 PS:先使用root创建数据库,然后再授权grant all privileges on 数据库.* to 用户名@"%& ...

  2. 聊聊数据库~4.SQL优化篇

    1.5.查询的艺术 上期回顾:https://www.cnblogs.com/dotnetcrazy/p/10399838.html 本节脚本:https://github.com/lotapp/Ba ...

  3. 聊聊数据库~5.SQL运维上篇

    1.6.SQL运维篇 运维这块逆天只能说够用,并不能说擅长,所以这篇就当抛砖之用,欢迎补充和纠错 PS:再说明下CentOS优化策略这部分的内容来源:首先这块逆天不是很擅长,所以主要是参考网上的DBA ...

  4. 聊聊数据库~6.SQL运维中篇

    上篇回顾:https://www.cnblogs.com/dotnetcrazy/p/10810798.html#top 1.6.5.MySQL日志相关 本文的测试环境:MySQL5.7.26.Mar ...

  5. Mybaits配置多个数据库操作sql环境

    mybitas可以配置sql语句适用于不同数据库下的操作,因为不同数据库sql语句可能有差别,接下来介绍如果进行操作 1.在jdbc.properprites配置驱动 jdbc.driver=com. ...

  6. SQL Server数据库性能优化之SQL语句篇【转】

    SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一 ...

  7. SQL数据库基础知识-巩固篇<一>

    SQL数据库基础知识-巩固篇<一>... =============== 首先展示两款我个人很喜欢的数据库-专用于平时个人SQL技术的练习<特点:体积小,好安装和好卸载,功能完全够用 ...

  8. 使用Python批量修改数据库执行Sql文件

    由于上篇文章中批量修改了文件,有的时候数据库也需要批量修改一下,之前的做法是使用宝塔的phpMyAdmin导出一个已经修改好了的sql文件,然后依次去其他数据库里导入,效率不说极低,也算低了,且都是些 ...

  9. [转载] 我的WafBypass之道(SQL注入篇)

    我的WafBypass之道(SQL注入篇) Web安全 作者:先知技术社区   2016-11-23  7,566   [本文转自安全脉搏战略合作伙伴先知技术社区 原帖地址  安全脉搏编辑huan97 ...

随机推荐

  1. ionic 侧栏菜单用法

    第一步: 引入js和css文件我这里是直接引入的cdn,ionic是基于angular的,bundle.min.js把常用angular的js已经压缩到一起,可以直接引入.bundle.min.js, ...

  2. XML生成XAMl扩展

    所有的WPF控件列为枚举 代码如: 1 public enum ControlType 2 { 3 Window_Resources, 4 Page_Resources, 5 Grid, 6 Stac ...

  3. 【Spring】SpringMVC配置文件

    SpringMVC中一般会引入三个配置文件applicationContext.xml.dispatcher-servlet.xml(SpringMVC-servlet.xml).web.xml 1. ...

  4. ssh 使用 sed 替换的时候,替换的字符串有单双引号的时候怎么用

    线上有一个脚本需要 ssh 登录远程机,然后完成特定文件中的某个值,替换的字符中有单引号,所以需要特定的写法,才能成功 1).ssh 远程执行命令,替换字符串中有单引号( ' ) ssh zhuzi@ ...

  5. Leetcode 34 Find First and Last Position of Element in Sorted Array 解题思路 (python)

    本人编程小白,如果有写的不对.或者能更完善的地方请个位批评指正! 这个是leetcode的第34题,这道题的tag是数组,需要用到二分搜索法来解答 34. Find First and Last Po ...

  6. Leetcode35 Search Insert Position 解题思路(python)

    本人编程小白,如果有写的不对.或者能更完善的地方请个位批评指正! 这个是leetcode的第35题,这道题的tag是数组,python里面叫list,需要用到二分搜索法 35. Search Inse ...

  7. Unable to launch the IIS Express Web server

    尝试运行程序,出现此异常提示Unable to launch the IIS Express Web server. 解决问题,是把网址修改为另一个试试: 把http://localhost:1114 ...

  8. Dubbo 源码分析 - 服务导出

    1.服务导出过程 本篇文章,我们来研究一下 Dubbo 导出服务的过程.Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑.整个逻辑大致可 ...

  9. 【mysql注入】mysql注入点的技巧整合利用

    [mysql注入]mysql注入点的技巧整合利用 本文转自:i春秋社区 前言: 渗透测试所遇的情况瞬息万变,以不变应万变无谓是经验与技巧的整合 简介: 如下 mysql注入点如果权限较高的话,再知道w ...

  10. 【sql注入】浅谈sql注入中的Post注入

    [sql注入]浅谈sql注入中的Post注入 本文来源:i春秋学院 00x01在许多交流群中,我看见很多朋友对于post注入很是迷茫,曾几何,我也是这样,因为我们都被复杂化了,想的太辅助了所以导致现在 ...