Oliver's Blog

小菜鸟要努力学习哦

在psql命令行(客户端)下,执行了一次\l,查看所有的库信息

可以直接基于psql查看一些信息,也可以基于psql进入到命令行后,再做具体操作

\l查看所有的库信息

可以直接基于psql操作。

1
2
3
可以使用psql --help,查看psql的命令
可以直接进入到命令行的原因是psql默认情况下,就是以postgres用户去连接本地的pgsql,所以可以直接进入
下面的图是默认的连接方式

默认连接方式

后面都基于psql的命令行(客户端)去进行操作

命令不用背,需要使用的时候,直接找帮助文档,在psql命令行中,直接输入如下命令:

1
2
\help,即可查看到数据库级别的一些命令
\?,可以查看到服务级别的一些命令

用户相关

构建用户命令:

1
2
3
# create user默认有连接权限,而create role没有,但可以基于选项设置
CREATE USER 名称 [ [ WITH ] 选项 [ ... ] ]
CREATE ROLE 名称 [ [ WITH ] 选项 [ ... ] ]

创建一个超级管理员用户:

1
CREATE USER root WITH SUPERUSER PASSWORD 'root';

创建超级管理员

退出psql命令行

退出命令行

尝试去用root用户登录的psql命令:

1
psql -h 192.168.11.32 -p 5432 -U root -W

根据提示发现,光有用户不让登录,用户需要有一个数据库,创建一个root库:

1
create database root;

创建数据库

可以在不退出psql的前提下,直接切换数据库

切换数据库

也可以退出psql,重新基于psql命令去切换用户以及数据库

如果要修改用户信息,或者删除用户,可以查看

1
2
# 修改用户,直接基于ALTER命令操作
# 删除用户,直接基于DROP命令操作

如果要查看现在的全部用户信息

查看全部用户信息

权限操作

权限操作前,要先掌握一下PGSQL的逻辑结构

逻辑结构图

PostgreSQL一个数据库中有多个schema,在每个schema下都有自己的相应的表信息,权限粒度比MySQL更细一些。

在PostgreSQL中,权限的管理分为很多多层:

  • server、cluster、tablespace级别:基于pg_hba.conf去配置;
  • database级别:通过grant命令操作;
  • namespace、schema级别:使用不多,暂不了解;
  • 对象级别:通过grant命令去设置。

对database或者是对象级别做权限控制可以直接基于grant命令去操作,查看grant命令的使用帮助:

1
2
# 查看grant命令
\help grant

小任务

  • 构建一个用户
  • 构建一个数据库
  • 在这个数据库下构建一个schema(数据库默认有一个public的schema)
  • 将这个schema的权限赋予用户
  • 在这个schema下构建一个表
  • 将表的select,update,insert权限赋予用户

完成上述操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- 准备用户
create user user_oliver with password 'password';
-- 准备数据库
create database database_oliver;
-- 切换数据库
\c db_oliver;
-- 构建schema
create schema schema_oliver;
-- 将schema的拥有者修改为oliver用户
alter schema schema_oliver owner to user_oliver;
-- 将database_oliver库下的schema_oliver的schema中的表的增,改,查权限赋予给user_oliver用户
grant select,insert,update on all tables in schema schema_oliver to user_oliver;
-- 用postgres用户先构建一张表
create table schema_oliver.test(id int);
-- 切换到user_oliver用户。
\c user_oliver -password
-- 报错:
-- 致命错误: 对用户"-user_oliver"的对等认证失败
-- Previous connection kept
-- 上述方式直接凉凉,原因是匹配连接方式时,基于pg_hba.conf文件去从上往下找
-- 找到的第一个是local,匹配上的。发现连接方式是peer。
-- peer代表用当前系统用户去连接PostgreSQL
-- 当前系统用户只有postgres,没有user_oliver,无法使用peer连接
-- 想构建user_oliver用户时,发现PostgreSQL的所有文件拥有者和所属组都是postgres,并且能操作的只有拥有者

文件权限

1
2
3
4
5
6
7
-- 基于上述问题,不采用本地连接即可。
-- 采用远程连接。
psql -h 127.0.0.1 -p 5432 -U user_oliver -W
-- 这样依赖,跳过了local链接方式的匹配,直接锁定到后面的host,host的连接方式是md5,md5其实就是密码加密了。
-- 登录后,直接输入
\dn
-- 查看到当前database下有两个schema

这种权限的赋予方式,可以用管理员用户去构建整体表结构,分配指定用户,赋予不同的权限,就不怕用户误操作了。

两个配置文件:

  • PostgreSQL的远程连接配置;
  • PostgreSQL的日志配置。

PostgreSQL的主要配置放在数据目录下的, postgresql.conf 以及 pg_hba.conf 配置文件

1
2
# 配置文件目录
ls -l /var/lib/pgsql/12/data

配置文件

上图可以看到,PostgreSQL的核心文件,都属于postgres用户,操作的时候,别用root用户,容易出问题,先切换到postgres用户再操作。

远程连接配置

PostgreSQL默认情况下不支持远程连接的,这个跟MySQL一样。

  • MySQL给mysql.user追加用户,一般是采用grant的命令添加;
  • PostgreSQL要基于配置文件修改,才能制定用户是否可以远程连接。

修改pg_hba.conf配置文件

用户以及对应数据库和连接方式的编写模板:

用户权限配置模板

1
2
3
4
5
6
7
8
9
10
11
12
# 第一块
local:代表本地连接,host代表可以指定连接的ADDRESS
# 第二块
database编写数据库名,如果写all,代表所有库都可以连接
# 第三块
user编写连接的用户,可以写all,代表所有用户
# 第四块
address代表那些IP地址可以连接
# 第五块
method加密方式,这块不用过多关注,使用md5即可
# 示例配置:允许任意地址的全部用户连接所有数据库
host all all 0.0.0.0/0 md5

pg_hba.conf示例配置

为了实现远程连接,除了用户级别的这种配置,还要针对服务级别修改一个配置

服务级别的配置在postgresql.conf

postgresql.conf原始配置

发现默认情况下,PostgreSQL只允许localhost连接,直接配置为*即可解决问题

postgresql.conf示例配置

为了生效,需要重启服务:

1
2
# 使用root用户重启
sudo systemctl restart postgresql-12

数据库的日志配置

查看postgresql.conf文件

postgresql.conf日志原始配置

PostgreSQL默认情况下,只保存7天的日志,循环覆盖。

1
2
3
4
5
6
7
8
9
10
11
12
# 代表日志是开启的。
logging_collector = on
# 日志存放的路径,默认放到当前目录下的log里
log_directory = 'log'
# 日志的文件名,默认是postgresql为前缀,星期作为后缀
log_filename = 'postgresql-%a.log'
# 默认一周过后,日志文件会被覆盖
log_truncate_on_rotation = on
# 一天一个日志文件
log_rotation_age = 1d
# 一个日志文件,没有大小限制
log_rotation_size = 0

主要在Linux中安装,不推荐在Windows下安装。

Linux的版本尽量使用CentOS 7.x版本,最好是7.6或者是7.8版本。

去官网找安装的方式:

官网安装方式

选择好PostgreSQL的版本,以及Linux的发行版本

Linux安装12版本

拿到命令直接在Linux中运行即可

1
2
3
4
5
6
7
8
9
10
# 下载PGSQL的rpm包
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 安装PGSQL12的软件程序,需要下载,需要等一会,一般不会失败,即便失败,他也会重新帮你找镜像
sudo yum install -y postgresql12-server
# 数据库初始化
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb
# 设置开启启动项,并设置为开启自行启动
sudo systemctl enable postgresql-12
# 启动PGSQL
sudo systemctl start postgresql-12

这种属于Windows下的傻瓜式安装,基本不会出错。

如果出错,可能是如下的问题:

  • 安装Linux的时候,一定要选择最小安装;
  • Linux不能连接外网;
  • Linux中的5432端口可能被占用。

PostgreSQL不推荐使用root管理,在安装成功postgreSQL后,他默认会给你创建一个用户:postgres

使用PostgreSQL前需要先切换到postgres

1
su postgres

切换到postgres用户后,直接输入psql即可进入到postgreSQL提供的客户端

1
2
3
# 进入命令行
psql
# 查看有哪些库,如果是新安装的,有三个库:postgres,template0,template1

Windows版本的下载地址:https://sbp.enterprisedb.com/getfile.jsp?fileid=1258242

技术没有好坏之分,主要看一下是否符合业务的需要,能否解决业务需求;其次也要看社区的活跃度以及更新的频次。

MySQL不支持的几点内容:

  • MySQL的数据类型不够丰富;
  • MySQL不支持序列概念(Sequence);
  • 使用MySQL时,网上比较好用的插件;
  • MySQL的性能优化监控工具不是很多,定位问题的成本是比较高;
  • MySQL的主从复制没有一个官方的同步策略,同步问题难以解决;
  • MySQL虽然开源但不够彻底。

PostgreSQL相对MySQL上述问题的特点:

  • PostgreSQL的数据类型嘎嘎丰富;
  • PostgreSQL是有序列的概念的;
  • PostgreSQL的插件特别丰富;
  • PostgreSQL支持主从复制的同步操作,可以实现数据的零丢失;
  • PostgreSQL的MVCC实现和MySQL不大一样(PostgreSQL一行数据会存储多个版本,最多可以存储40亿个事务版本)。

PostgreSQL是一个功能强大的 开源 的关系型数据库,底层基于C实现。

PostgreSQL的开源协议和Linux内核版本的开源协议是一样的。也就是BSD协议,这个协议基本和MIT开源协议一样,就是你可以对PostgreSQL进行一些封装,然后商业化来收费。

PostgreSQL的名字咋来的:之前叫Ingres,后面为了解决一些Ingres中的一些问题,作为后面的Ingres,就起名叫Postgre。

PostgreSQL版本迭代的速度比较快,现在最新的正式的发布版本,已经到了15.RELEASE。

PostgreSQL的版本选择一般有两种:

  • 如果为了稳定的运行,推荐使用12.x版本。
  • 如果想体验新特性,推荐使用14.x版本。

PostgreSQL允许跨版本升级,而且没有什么大问题。

PostgreSQL社区特别活跃,基本是三个月一发版,也就意味着很多常见的BUG都可以得到及时的修复。

PostgreSQL其实在国外使用的比较多,国内暂时还是以MySQL为主。

但是国内很多国产数据库都是基于PostgreSQL做的二次封装:比如华为GaussDB,还有腾讯的Tbase等。

甚至很多公司原来用的Oracle,直接平转到PostgreSQL,同时国内的很多云厂商都支持PostgreSQL了。

PostgreSQL因为开源,所以有很多做数据迁移的工具,可以快速的从MySQL,SQLServer,Oracle直接平转到PostgreSQL,比如pgloader这样的数据迁移工具。

PostgreSQL的官方社区地址:https://www.postgresql.org/

PostgreSQL的国内社区地址:http://www.postgres.cn/v2/home

机器字长

基本概念

也叫基本字长,参与运算的二进制数据的位数,决定了寄存器、ALU、数据总线位数,代表了运算精度

易混淆概念

  • 机器字长:一般等于内部寄存器的大小
  • 指令字长:一个指令包含的二进制码的位数
  • 存储字长:存储单元的二进制码的长度/位数

注意:所有字长都必须是字节的整数倍。

机器字长

主存容量

基本概念

一般指主存的最大容量,单位是字节Byte,运行时程序和数据都在主存中,主存容量越大,可运行的程序就越多,MAR位数(但不一定是当前机器安装内存的容量)决定了可寻址范围的最大值。

主存容量

运算速度

吞吐量:

单位时间内处理的请求数量,由如下因素决定:

  • 信息输入内存的速度
  • CPU取指令的速度
  • 数据取出/存入内存的速度
  • 从内存转出到外部设备的速度

响应时间

从用户发送请求到收到响应经过的时间,,由如下因素决定:

  • CPU时间(运行程序花费的时间)
  • 等待时间(磁盘访问/主存访问/IO操作/OS开销/网络传输)

CPU时钟周期

单个动作所花费的时间

  • 节拍脉冲或T周期,即主频的倒数
  • CPU中最小的时间单位,每个动作至少一个时钟周期
  • 单位:秒

主频(CPU时钟频率)

单位时间完成基本动作的数量

  • 机器内部主时钟的频率
  • 主频越高花费时间越短,执行指令速度越快
  • 单位:Hz(赫兹),即次数/秒
  • 时钟周期 = 1/主频

CPI(Clock cycle Per Instruction)

执行一条指令所需的时钟周期数

CPU执行时间

即运行一个程序所花费的时间,= CPU时钟周期数/主频=(指令条数 * CPI)/主频

三要素(相互制约):

  • 主频(时钟频率)
  • 每条指令所用的时钟周期数(CPI)
  • 指令条数

其它

  • MIPS:Million Instructions Per Second = 指令条数/(执行时间*10^6)
  • MFLOPS:Mega Floating-point Operations PS = 浮点数操作次数/(执行时间*10^6)
  • GFLOPS:Giga Floating-point Operations PS = 浮点数操作次数/(执行时间*10^9)
  • TFLOPS:Tera Floating-point Operations PS = 浮点数操作次数/(执行时间*10^12)

从源文件到可执行文件

  1. 预处理阶段
  • 高级语言:C/C++、Java、GO
  • 删注释;引入包含文件
  1. 编译阶段
  • 汇编语言:指令代码
  1. 汇编阶段
  • 机器语言:二进制编码
  1. 链接阶段
  • +库函数

计算机的工作过程

现代计算机组织结构

  • 入/出/存/算/控
  • 采用二进制表示数据和指令
  • 采用存储程序方式
  • CPU:运算器与控制器合并到微处理器
  • 以存储器为核心,IO设备尽可能绕过CPU

现代计算机结构

以存储器为中心的计算机结构

以存储器为中心的计算机结构

现代计算机组织结构

现代计算机组织结构

冯诺依曼结构

入/出/存/算/控

采用二进制表示数据和指令

  • 以同等地位在存储器中,按地址寻访
  • 指令由操作码和地址码组成
  • 指令按顺序存放和执行,也可改变指令顺序

采用存储程序方式

  • 事先编制好程序,并与所需数据预先存入主存
  • 控制器自动地、连续地从存储器取出指令并执行

冯诺依曼结构

冯诺依曼结构的模型机

冯诺依曼结构模型机

章节1: 认识复杂度、对数器、二分法与异或运算 (20节)

  • 什么是算法数据结构
  • 何为常数时间的操作
  • 常见的常数时间操作
  • 时间复杂度的意义
  • 选择排序
  • 冒泡排序
  • 插入排序
  • 额外空间复杂度
  • 面试、比赛、刷题中、一个问题的最优解是什么意思
  • 常见的时间复杂度
  • 算法和数据结构学习的大脉络
  • 什么叫对数器
  • 什么叫二分法
  • 在一个有序数组中,找=某个数的最左侧位置
  • 局部最小值
  • 认识异或运算
  • 如何不用额外变量交换两个数的值
  • 一个数组中有一种数出现了奇数次,其他数都出现了偶数次怎么找到这种数
  • 怎么把一个int类型的数,提取出最右侧1来
  • 一个数组中有一种数出现了奇数次,其他数都出现了偶数次怎么找到这两种数

章节2: 链表结构、栈、队列、递归行为、哈希表和有序表 (13节)

  • 单双向链表节点结构
  • 单双链表如何反转
  • 把给定值删除
  • java和c++在内存释放上的问题
  • 什么是栈和队列
  • 栈和队列的实际实现(双向链表实现)
  • 栈和队列的实际实现(数组实现)
  • 既然语言都有这些结构和api,为什么还需要手撸练习
  • 如何用队列结构实现栈结构
  • 如何使用栈结构实现队列结构
  • 求数组arr[L..R]中的最大值,怎么用递归方法实现
  • Master公式
  • 哈希表

章节3: 归并排序与随机快排 (15节)

  • 什么是归并排序
  • 归并排序(递归方法实现)
  • 归并排序(非递归方法实现)(1)
  • 归并排序(非递归方法实现)(2)
  • 归并排序时间复杂度分析
  • 根据常见面试题深入理解归并排序
  • 根据常见面试题深入理解归并排序代码解析
  • 在一个数组中求降序对
  • Partition过程
  • 荷兰国旗问题
  • 快速排序1.0
  • 快速排序2.0
  • 快速排序3.0
  • 怎么解决复杂度
  • 额外空间复杂度怎么估计

章节4: 比较器与堆 (18节)

  • 完全二叉树结构
  • 堆是什么
  • 大根堆讲解1
  • 大根堆代码1
  • 大根堆讲解2
  • 答疑
  • 下沉的复杂度是多少
  • 堆排序是什么
  • 堆排序优化1
  • 直观认识完全二叉树
  • 答疑1
  • 怎么保证每一个数再排完序的距离不会超过k
  • 答疑2
  • 比较器(重载比较运算符)
  • 比较器(排序)
  • 比较器(特殊标准排序的结构)
  • 什么情况下可以用语言提供的堆结构,什么情况下必须手动写
  • 什么情况下可以用语言提供的堆结构,什么情况下必须手动写代码实现

章节5: trie、桶排序、排序总结 (18节)

  • 答疑
  • 前缀树
  • 怎么实现前缀树
  • 答疑
  • word这个字符串之前加入过几次
  • 有多少字符串是以pre这个字符串作为前缀的
  • 删除
  • 答疑
  • 前缀树是怎么拓展的
  • 不基于比较的排序
  • 基数排序
  • 基数排序代码
  • 基数排序代码拆解
  • 计数排序和基数排序
  • 选择、冒泡、插入排序有没有稳定性
  • 归并、快排、堆排序有没有稳定性
  • 排序算法总结
  • 常见的坑

章节6: 链表相关面试题 (14节)

  • 链表问题
  • 快慢指针简介
  • 快慢指针代码
  • 给定一个单链表的头节点head,判断该链表是否为回文机构
  • 将单链表按某值划分成左边小、中间相等、右边大的形式
  • 特殊的单链表节点(用哈希表的方法)
  • 不用哈希表的方法
  • 两个有环也可能无环的单链表,如果相交,返回相交的第一个节点,如果不想交,返回null
  • 两个有环也可能无环的单链表,如果相交,返回相交的第一个节点,如果不想交,返回null代码实现
  • 两个无环链表是否相交
  • 两个无环链表是否相交代码
  • 答疑
  • 两个链表都有环有几种结构
  • 能不能不给单链表的头节点,只给想要删除的节点,就能做到在链表上把这个删掉

章节7: 二叉树的基本算法 (12节)

  • 什么叫二叉树
  • 二叉树遍历(什么叫子树)
  • 二叉树遍历是什么意思
  • 二叉树遍历实现
  • 非递归方式实现二叉树的遍历
  • 非递归方式实现二叉树的遍历(前序)
  • 非递归方式实现二叉树的遍历(中序)
  • 非递归方式实现二叉树的遍历(后序)
  • 实现二叉树按层遍历(队列方式)
  • 统计二叉树最大的宽度(用Map)
  • 统计二叉树最大的宽度(不用Map)
  • 二叉树的序列化和反序列化

章节8: 二叉树的递归套路 (16节)

  • 如何设计一个打印整棵树的打印函数
  • 给一个二叉树中的某个节点,返回该节点的后继节点1
  • 如果x没有又数
  • 后继
  • 给一个二叉树中的某个节点,返回该节点的后继节点2
  • 给一个二叉树中的某个节点,返回该节点的后继节点代码实现
  • 给定一个如如参数N,代表纸条都从下边上向上方连续对着N次,请从上到下导引所有折痕的方向1
  • 给定一个如如参数N,代表纸条都从下边上向上方连续对着N次,请从上到下导引所有折痕的方向2
  • 二叉树的递归套路1
  • 什么叫平衡树
  • 二叉树的递归套路2
  • 列出所有可能性后,确定到底需要向左树和右树要什么样的信息
  • 给定一颗二叉树的头结点head,任何两个节点之间都存在距离,返回整课二叉树的最大距离
  • 给定二叉树的头节点head,返回这个二叉树最大的二叉树搜索子树的头节点
  • 二叉树递归套路3
  • 排队的最大快乐值

章节9:贪心算法 (8节)

  • 返回这颗二叉树是不是满二叉树1
  • 返回这颗二叉树是不是满二叉树2
  • 返回a和b的最低公共祖先
  • 贪心算法
  • 贪心算法例子
  • 从头到尾讲一道利用贪心算法求解的题目(1)
  • 从头到尾讲一道利用贪心算法求解的题目(2)
  • 从头到尾讲一道利用贪心算法求解的题目(3)

章节10:并查集结构和图相关的算法 (10节)

  • 贪心算法求解的标准过程
  • 贪心算法的解题套路
  • 贪心算法的解题套路实战
  • 返回如果点亮str中所有需要点亮的位置,至少需要几盏灯
  • 整分整块金条,怎么分最省铜板
  • 每做完一个项目马上获得的收益可以支持你去做下一个项目不能并行的做项目你最后获得的最大钱数
  • 并查集
  • isSameSet和union方法的代价越低越好
  • 并查集代码
  • 并查集优化

章节11:暴力递归 (7节)

  • 合并users返回合并之后的用户数量
  • 图的宽度优先&深度优先遍历(1)
  • 图的宽度优先&深度优先遍历(2)
  • 图的拓扑排序算法
  • 最小生成树算法之Kruskal
  • 最小生成树算法之Prim

章节12:动态规划 (8节)

  • Dijkstra算法
  • 证明Dijkstra算法
  • 改进后的Dijkstra算法
  • 暴力递归
  • 汉诺塔问题(1)
  • 汉诺塔问题(2)
  • 汉诺塔问题(3)
  • 给你一个栈请你逆序这个栈不能申请额外的数据结构只能使用递归函数如何实现

章节13:暴力递归到动态规划1 (8节)

  • 二叉树序列化
  • 尝试
  • 打印一个字符串的全部子序列
  • 打印一个字符串的全部排列
  • 打印一个字符串的全部排列不出现重复的排列
  • 从左往右尝试模型1
  • 从左往右尝试模型2
  • 范围上尝试的模型

章节14:暴力递归到动态规划2 (9节)

  • 课前例题1讲解
  • 课前例题2讲解
  • N皇后
  • N皇后方法1
  • N皇后方法2
  • 回答问题
  • 怎么尝试一件事
  • 动态规划
  • 经典动态规划

章节15:暴力递归到动态规划3 (8节)

  • 返回让所有咖啡杯变干净的最早完成时间
  • 返回所有的路径中最小的路径和(1)
  • 返回所有的路径中最小的路径和(2)
  • 解题规律
  • 值为正数不重复每个值代表一种面值的货币每种面值的货币求组成 aim 的方法数(1)
  • 值为正数不重复每个值代表一种面值的货币每种面值的货币求组成 aim 的方法数(2)
  • 值为正数不重复每个值代表一种面值的货币每种面值的货币求组成 aim 的方法数(3)
  • 枚举行为优化

章节16:暴力递归到动态规划4 (9节)

  • 返回需要至少多少张贴纸可以完成任务方法1(1)
  • 返回需要至少多少张贴纸可以完成任务方法1(2)
  • 返回需要至少多少张贴纸可以完成任务方法2
  • 总结
  • 两个字符串的最长公共子序列问题(1)
  • 两个字符串的最长公共子序列问题(2)
  • 两个字符串的最长公共子序列问题(13)
  • 返回让所有咖啡杯变干净的最早完成时间方法1
  • 返回让所有咖啡杯变干净的最早完成时间方法2
0%