From 1fa5c43a0b12545a3070c4a6ed88a23f91978d3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=85=E8=AF=97?= <1101928181@qq.com> Date: Fri, 12 Jul 2024 22:53:58 +0800 Subject: [PATCH] 0712 --- ...07\344\273\275\350\277\230\345\216\237.md" | 86 ++++++ .../20240706_postgresql.md" | 79 +++++ ...75\344\270\216\350\277\230\345\216\237.md" | 119 ++++++++ ...26\347\250\213\345\205\245\351\227\250.md" | 273 ++++++++++++++++++ ...25\345\217\212\350\257\255\345\217\245.md" | 183 ++++++++++++ 5 files changed, 740 insertions(+) create mode 100644 "45\351\253\230\351\233\205\350\257\227/20240704_mysql\346\225\260\346\215\256\345\272\223\347\232\204\345\244\207\344\273\275\350\277\230\345\216\237.md" create mode 100644 "45\351\253\230\351\233\205\350\257\227/20240706_postgresql.md" create mode 100644 "45\351\253\230\351\233\205\350\257\227/20240709_\346\225\260\346\215\256\345\272\223\347\232\204\345\244\207\344\273\275\344\270\216\350\277\230\345\216\237.md" create mode 100644 "45\351\253\230\351\233\205\350\257\227/20240710_Shell\347\274\226\347\250\213\345\205\245\351\227\250.md" create mode 100644 "45\351\253\230\351\233\205\350\257\227/20240712_Shell\344\270\255\347\232\204\346\265\213\350\257\225\345\217\212\350\257\255\345\217\245.md" diff --git "a/45\351\253\230\351\233\205\350\257\227/20240704_mysql\346\225\260\346\215\256\345\272\223\347\232\204\345\244\207\344\273\275\350\277\230\345\216\237.md" "b/45\351\253\230\351\233\205\350\257\227/20240704_mysql\346\225\260\346\215\256\345\272\223\347\232\204\345\244\207\344\273\275\350\277\230\345\216\237.md" new file mode 100644 index 0000000..192c911 --- /dev/null +++ "b/45\351\253\230\351\233\205\350\257\227/20240704_mysql\346\225\260\346\215\256\345\272\223\347\232\204\345\244\207\344\273\275\350\277\230\345\216\237.md" @@ -0,0 +1,86 @@ +1. 逻辑备份:默认情况下是,即备份结构又备份数据 + + 1. mysqldump: 单库备份,不会包含建库语句。所以恢复时要先指定数据库。 + + 1. 要么在恢复时,先指定好数据库(这个数据可以任意) + + ```bash + mysqldump -u root -p test2 > /tmp/test.sql + ``` + + 2. 指定多个库的备份,已经包含建库语句了,所以恢复时不指定数据库 + + 1. --databases 库1 库2 .. + + 2. ```bash + mysqldump -u root -p --databases test2 test3 > /tmp/test.sql + ``` + + 3. 备份所有数据库 + + 1. ```bash + mysqldump -u root -p --all-databases > /tmp/test.sql + ``` + + 4. 备份单个表 + + 1. ```bash + # mysqldump -u 用户名 -p 库名 表名> 备份的文件路径 + mysqldump -u root -p mysql_test student> /tmp/test.sql + ``` + + 5. 备份多个表 + + 1. ```bash + # mysqldump -u 用户名 -p 库名 表名1 表2 .. > 备份的文件路径 + mysqldump -u root -p mysql_test student course> /tmp/test.sql + ``` + + 6. 只备份数据库结构,但不备份数据 + + 1. ```bash + mysqldump -u root -p --no-data mysql_test > /tmp/student.sql + ``` + + 7. 只备份数据,但不备份结构 + + 1. ```bash + mysqldump -u root -p --no-create-info mysql_test > /tmp/student.sql + ``` + + 8. 备份数据库,压缩输出 + + 1. ```bash + mysqldump -u root -p mysql_test | gzip > /tmp/test.sql.gz # 先压缩再备份 + gzip -d < /tmp/test.sql.gz | mysql -u root -p # gzip -d = gunzip + gunzip < /tmp/test.sql.gz | mysql -u root -p + ``` + + + +2. 还原(导入) + + 1. mysql -u root -p 数据库名 < 要恢复的文件 (前提是这个数据库名要真实存在) + + ```bash + mysql -u root -p test2 < /tmp/test.sql + ``` + + + + 2. 登录mysql后,先选择要恢复的数据库,再用source 要恢复的文件来恢复 + + ```bash + use test2; + source /tmp/test.sql + ``` + + + +3. 商业的备份工具 + +4. phpmyadmin + +5. 第三方的连接客户端也可以备份 + +6. 想想如何实现自动备份(周期任务,预习shell脚本的写法,全量和增量的备份) \ No newline at end of file diff --git "a/45\351\253\230\351\233\205\350\257\227/20240706_postgresql.md" "b/45\351\253\230\351\233\205\350\257\227/20240706_postgresql.md" new file mode 100644 index 0000000..abf0ac0 --- /dev/null +++ "b/45\351\253\230\351\233\205\350\257\227/20240706_postgresql.md" @@ -0,0 +1,79 @@ +# postgresql + +基本操作 + +```postgresql +本地登录postgresql,先切换到postgres这个用户 +su postgres +再连接postgresql,用psql命令,默认什么参数和选项都不写。表示直接连接本地的数据库 +psql +连接数据库时可以指定用户和数据库 +psql -U user -d dbname + 本地连接不需要密码 + +列举数据库,相当于mysql的show databases +\l # list + +切换数据库,相当于mysql的use dbname +\c dbname # change + +列举表,相当于mysql的show tables +\dt \desc table + +查看表结构,相当于desc tblname,show columns from tbname +\d tblname + +\di 查看索引 + +创建数据库: +create database [数据库名]; +删除数据库: +drop database [数据库名]; +*重命名一个表: +alter table [表名A] rename to [表名B]; +*删除一个表: +drop table [表名]; + +*在已有的表里添加字段: +alter table [表名] add column [字段名] [类型]; +*删除表中的字段: +alter table [表名] drop column [字段名]; +*重命名一个字段: +alter table [表名] rename column [字段名A] to [字段名B]; +*给一个字段设置缺省值: +alter table [表名] alter column [字段名] set default [新的默认值]; +*去除缺省值: +alter table [表名] alter column [字段名] drop default; +在表中插入数据: +insert into 表名 ([字段名m],[字段名n],......) values ([列m的值],[列n的值],......); +修改表中的某行某列的数据: +update [表名] set [目标字段名]=[目标值] where [该行特征]; +删除表中某行数据: +delete from [表名] where [该行特征]; +delete from [表名];--删空整个表 +创建表: +create table ([字段名1] [类型1] ;,[字段名2] [类型2],......<,primary key (字段名m,字段名n,...)>;); +\copyright 显示 PostgreSQL 的使用和发行条款 +\encoding [字元编码名称] + 显示或设定用户端字元编码 +\h [名称] SQL 命令语法上的说明,用 * 显示全部命令 +\prompt [文本] 名称 + 提示用户设定内部变数 +\password [USERNAME] 修改密码 + securely change the password for a user +\q 退出 psql + +``` + + + +1. 设置远程访问 + + 1. 改两个conf + 2. 设置密码 + 3. 防火墙和安全组开放5432端口,试着改端口 + 4. 本地使用客户端去连接 + + **注意 pg_hba.conf 的最后加密方式,不要选trust** + + diff --git "a/45\351\253\230\351\233\205\350\257\227/20240709_\346\225\260\346\215\256\345\272\223\347\232\204\345\244\207\344\273\275\344\270\216\350\277\230\345\216\237.md" "b/45\351\253\230\351\233\205\350\257\227/20240709_\346\225\260\346\215\256\345\272\223\347\232\204\345\244\207\344\273\275\344\270\216\350\277\230\345\216\237.md" new file mode 100644 index 0000000..f7b37b7 --- /dev/null +++ "b/45\351\253\230\351\233\205\350\257\227/20240709_\346\225\260\346\215\256\345\272\223\347\232\204\345\244\207\344\273\275\344\270\216\350\277\230\345\216\237.md" @@ -0,0 +1,119 @@ +备份的分类 + +- 物理 + +- 逻辑备份 + +- 冷备份:停止服务,再备份 + +- 温备份: 停止写入。只能读取 + +- 热备份:不停止服务,直接备份 + + + +- 逻辑备份: + - 完全备份,全量备份 + - 差异备份 + - 增量备份:二进制的日志 + +MySQL: + +- 备份与还原 + + ```bash + # 备份单个数据库 + mysqldump -u root -p 要备份的数据库 > 保存的位置 + mysqldump -u root -p Jd50 > /tmp/t1.sql + # 恢复单个数据库 + mysql -u root -p 要还原的数据库 < 保存的位置 + # 单个数据库的恢复需要先创建好,名字任意 + mysql -u root -p Jd50 < /tmp/t1.sql + # 另一种恢复方法,先登录mysql,再use要被恢复的数据库 + source 保存的位置 + + + # 多个数据库一起备份 + mysqldump -u root -p --databases 库1 库2 ... > 保存的位置 + mysqldump -u root -p --databases u1 u2 u3 > /tmp/u234.sql + # 多个数据库一起恢复 + mysql -u root -p < 保存的位置 + mysql -u root -p < /tmp/u234.sql + # 另一种恢复方法,先登录mysql + source 保存的位置 + + + # 备份所有数据库 + mysqldump -u root -p --all-databases > 保存的位置 + # 多个数据库一起恢复 + mysql -u root -p < 保存的位置 + # 另一种恢复方法,先登录mysql + source 保存的位置 + + + # 备份某个数据库单个表 + mysqldump -u root -p 要备份的数据库 表名 > 保存的位置 + # 恢复单个数据库单个表 + mysql -u root -p 要还原的数据库 < 保存的位置 + + # 备份某个数据库多个表 + mysqldump -u root -p 要备份的数据库 表名1 表2 > 保存的位置 + # 恢复单个数据库多个表 + mysql -u root -p 要还原的数据库 < 保存的位置 + + # 备份压缩和解压缩 + mysqldump -u root -p 要备份的数据库 表名1 表2 | gzip > 保存的位置.gz + # 还原压缩包格式的备份 + # 1 + gunzip < 保存的位置.gz | mysql -u root -p + gunzip -c 保存的位置.gz | mysql -u root -p + # 2 + gzip -d < 保存的位置.gz | mysql -u root -p + gzip -cd 保存的位置.gz | mysql -u root -p + + # 逻辑备份,且是全量的,结构和数据一起备份了 + # 只备份结构,或只备份数据的等操作。。。。 + + # 尝试自己写脚本,通过周期任务实现自动备份 + ``` + + + +postgreSQL的备份和恢复 + +```bash +#备份 +pg_dump -U postgres -d test -f /tmp/post_test.sql +pg_dump -U postgres -d test > /tmp/post_test.sql +pg_dump -U postgres -Fc test > /tmp/post_test.dump # 用pg_restore来恢复 +# 恢复 +su postgres +psql -h 127.0.0.1 -U postgres -d 要恢复的数据库 -f 备份的地址 +psql -h 127.0.0.1 -U postgres -d 要恢复的数据库 < 备份的地址 + +#备份一个或多个表 +pg_dump -U postgres -d test -t 表名1 -t 表2 > /tmp/post_test.sql +# 恢复 +su postgres +psql -h 127.0.0.1 -U postgres -d 要恢复的数据库 -f 备份的地址 +psql -h 127.0.0.1 -U postgres -d 要恢复的数据库 < 备份的地址 + +# 备份所有数据库 +pg_dumpall -U > 位置 +# 恢复所有数据库 +psql < 位置 + +# 如果加了-h 主机,就要密码,而且一般要指定-U这个选项指定用户名 + + +# 压缩备份单个数据 +pg_dump -U postgres -d test -t teacher -t student | gzip > /tmp/ts.sql.gz +# 压缩恢复单个数据库 +gunzip < /tmp/ts.sql.gz | psql -h 127.0.0.1 -U postgres -d test + +#所有 +pg_dumpall | gzip > /tmp/222.sql.gz +gunzip < /tmp/222.sql.gz | psql + +``` + diff --git "a/45\351\253\230\351\233\205\350\257\227/20240710_Shell\347\274\226\347\250\213\345\205\245\351\227\250.md" "b/45\351\253\230\351\233\205\350\257\227/20240710_Shell\347\274\226\347\250\213\345\205\245\351\227\250.md" new file mode 100644 index 0000000..8983063 --- /dev/null +++ "b/45\351\253\230\351\233\205\350\257\227/20240710_Shell\347\274\226\347\250\213\345\205\245\351\227\250.md" @@ -0,0 +1,273 @@ +# 一、SHELL + +### (一)什么是shell + +使用SHELL的对话方式: + +1. 交互式(Interactive):用户输入一条命令,Shell 解释并执行一条。 +2. 非交互式,又叫批处理(Batch):用户事先编写一个 Shell 脚本(Script)文件,其中包含诸多命令,Shel1 会一次执行完所有命令。 + +查看当前系统支持哪些类型的shell : cat /etc/shells + +### (二)什么是shell脚本 + +shell脚本:就是把原来的Linux语句或命令放在一个文件中,然后通过这个程序文件去执行时,我们就说这个程序为shell脚本或shell程序,我们可以在脚本中输入一系统命令以及相关语法语句组合。 + +#### 1.shell脚本的基本格式 + +首先来创建一个基础的脚本 + +```bash +root@class3:~# vim t.sh +#!/bin/bash +# 第一行开头"#!/bin/bash",表示此行以下的代码语句是通过/bin/bash程序来解释执行。 +# #!/bin/bash为默认的解释器还有其他类型的解释器,#!/bin/python #!/bin/expect +# this is shell +# 第二行为注释内容,以#开头为注释信息,执行时被忽略。可以写一些shell脚本的介绍 +echo "hello world" +mkdir /opt/test +touch /opt/test/a.txt +ls -l /opt +#第3+行为执行语句或命令 +``` + +shell脚本文件一般以.sh结尾 + +#### 2.执行SHELL脚本的三种方式 + +1. 脚本路径执行:可以是绝对路径,也可以是相对路径。需要权限 + + ```bash + root@class3:~# /root/t.sh #绝对路径 + root@class3:~# ./t.sh #相对路径 + # 需要权限 + root@class3:~# chmod +x t.sh + ``` + +2. shell解释器执行:指定使用bash去执行,不需要权限 + + ```bash + root@class3:~#bash t.sh + ``` + +3. source或.:也可以直接执行,不需要权限,但是会影响当前环境 + + ```bash + root@class3:~#source t.sh + root@class3:~#. t.sh + ``` + + | 执行方式 | 是否需要权限 | 是否影响当前环境 | + | :-------------- | :----------: | :--------------: | + | 脚本路径执行 | yes | no | + | shell解释器执行 | no | no | + | source或. | no | yes | + + 因为路径和shell解释器形式,其实是开一个子进程,在子进程中执行脚本,所以不会影响到原来的环境 + +#### 3.shell脚本执行逻辑 + +1. 顺序执行:程序按从上到下顺序执行 +2. 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行 if +3. 循环执行:程序执行过程中需要重复执行多次某段语句 while for.0 + +### (三)脚本错误调试 bash -x -n + +#### 1.命令错误 + +默认后续的命令还会继续执行,可以使用 bash -x 进行观察 + +```bash +root@class1:~# cat tt.sh +#!/bin/bash +echo 111 +eho 222 +echo 333 + +root@class1:~# bash -x tt.sh ++ echo 111 +111 ++ eho 222 +tt.sh: 行 3: eho: 未找到命令 # 检测到错误 ++ echo 333 +333 +``` + +#### 2.语法错误 + +会导致后续的命令不继续执行,可以用bash -n 检查错误,但是提示的出错行数可能会因为嵌套结构而显得不准确 + +```bash +root@class1:~# cat tt.sh +#!/bin/bash +echo 111 +eho 666 +if +echo 777 + + +root@class1:~# bash -x tt.sh # 可能发现所有错误 ++ echo 111 +111 ++ eho 666 +tt.sh: 行 3: eho: 未找到命令 +tt.sh: 行 6: 语法错误:未预期的文件结束符 +root@class1:~# bash -n tt.sh # 只能发现语法错误 +tt.sh: 行 6: 语法错误:未预期的文件结束符 +``` + +## 二、变量 + +**自定义变量 语法为** : 变量名=变量值 + +- =号两边不能有空格 +- 变量名称**不能以数字开头** +- 字符串加引号 +- 变量名前加$,表示使用变量的值 + +```bash +root@class1:~#myage=18 # 注意没有空格 +``` + +**交互式定义变量 :** read -p + +语法 : read p "提示语" 变量名 + +```bash +# 语法 : read p "提示语" 变量名 +root@class1:~# read -p "请输入一个日期" date +请输入一个日期666 +date=666 +root@class1:~# echo $date +666 + +``` + +#### **只读变量** + +只读变量在声明后不能更改其值。在Bash shell中,通过readonly 命令来声明位置变量 + +```bash +root@class1:~# readonly name=张三 +root@class1:~# echo $name +张三 +root@class1:~# name=李四 +-bash: name: 只读变量 +# 一旦建立后,无法进行追加和删除 +root@class1:~# unset name +-bash: unset: name: 无法取消设定:只读variable +``` + +#### **环境变量** + +环境变量是一种特殊的预定义变量,不仅在当前Shell会话中可用,还会被所有子进程继承。 + +在当前shell环境中定义的变量是无法自动被其它子进程继承的,需要通过export命令去赋予 + +#### **位置变量** + +指的是从命令行传递给脚本或函数的参数。每个参数都有一个编号,从 $0 开始,其中 $0 是脚本本身的名字,而 $1、$2、$3 等依次对应第一个、第二个、第三个参数等。 + +```bash +#!/bin/bash +echo "脚本的文件名 $0" #会打印出脚本的文件名 +echo "$1" #脚本后面的第一个参数 +echo "$2" #脚本后面的第二个参数 +echo "$3" #脚本后面的第三个参数 +echo "${10}" #脚本后面的第十个参数 + +#①:$0是一个特殊变量,它代表脚本的文件名 +#②:${10}必须用大括号括起来,否则将$看成变量,在后面加0 +#$# 参数的个数 +``` + +### 特殊变量与符号 + +#### 1.符号 + +在变量中,有一些特殊符号,需要我们去掌握 + +| 符号 | 名称 | 作用 | +| ------ | ------ | ------------------- | +| " " | 双引号 | 弱引用 可以识别变量 "$name",将变量转成值 | +| ‘ ’ | 单引号 | 强引用 不能识别变量 '$name',不变值 | +| { } | 大括号 | 定义变量名的范围 ${dizhi}30 | +| \`` | 反撇 | 调用命令的执行结果 ,另一种写法$( 命令 ) \`命令` ||| + +#### 2.特殊变量 + +在预定义变量中,还存在一些特殊变量,比如在之前说到的$0就是一种特殊变量 + +| $* | 代表一个整体,把所有位置参数当成整体返回,所有参数 | +| ---- | ---------------------------------------------------------- | +| $@ | 代表独立个体,把所有位置参数当成个体返回,查询与上面的区别 | +| $? | 上一条命令的执行结果是否成功。正确为0,返回任何非0值为异常 | +| $# | 代表位置参数个数 | +| $0 | 代表当前脚本的名称 | +| $$ | 当前bash的pid | + + + +### (四)四则运算 + +加法 + + +减法 - + +乘法 \ * :*表示乘。但是因为其有特殊含义,需要加上\转义符进行转义,表达原本的意思 + +除法 / + +#### 1.expr运算 + +基本格式为:expr 变量 + 变量 (注意空格) + +```bash +expr $a+$b # 错误 +expr $a + $b +sum=$(expr $a + $b) +``` + +#### 2.使用(())运算 + +将变量a与b相加,格式为 :(( 变量名=算数表达式 )) + +```bash +(( sum=a + b )) +echo $sum +#()内可以直接调用变量,不需要加$符号 +``` + +#### 3.使用let运算 + +格式为 let 运算结果变量名=运算表达式 + +``` +let sum=$a + $b; +``` + +#### 4.方括号[ ]运算 + +语法为:运算结果变量名=$[算术表达式] + +```bash +a=1 +b=2 +sum=$[a+b] +echo $sum +``` + + + +尝试用脚本来实现一些运维的工作: + +1. 用脚本去自动备份数据库 +2. 用脚本去安装nginx, + + + +# Shell相关文档 + +https://blog.csdn.net/hy199707/article/details/135820345 + +https://www.runoob.com/linux/linux-shell.html diff --git "a/45\351\253\230\351\233\205\350\257\227/20240712_Shell\344\270\255\347\232\204\346\265\213\350\257\225\345\217\212\350\257\255\345\217\245.md" "b/45\351\253\230\351\233\205\350\257\227/20240712_Shell\344\270\255\347\232\204\346\265\213\350\257\225\345\217\212\350\257\255\345\217\245.md" new file mode 100644 index 0000000..7b8957b --- /dev/null +++ "b/45\351\253\230\351\233\205\350\257\227/20240712_Shell\344\270\255\347\232\204\346\265\213\350\257\225\345\217\212\350\257\255\345\217\245.md" @@ -0,0 +1,183 @@ +# Shell中的测试及语句 + +一、测试 + +1. 简单条件测试 + + 格式: + + ​ test 操作符 目录/文件 + + ​ [ 操作符 目录/文件] !!!:[ ] 两边与操作符和条件之间需要有空格 + + 常见操作符: + + - -d:测试是否为目录 + - -e:测试目录或文件是否存在 + - -f:测试是否为文件 + +2. 逻辑测试 + + 格式: + + ​ &&:逻辑的与,“而且”的意思 + + ​ ||:逻辑的或,“或者”的意思 + + ​ ! :逻辑的否 + +3. 整数比较 + + 语法: + + ​ [ 整数 操作符 整数 ] + + 操作符: + + - -eq:判断是否等于 + - -ne:判断是否不等于 + - -gt:判断是否大于 + - -lt:判断是否小于 + - -le:判断是否等于或小于 + - -ge:判断是否等于或大于 + +4. 字符串比较 + + 语法: + + ​ [字符串1 操作符 字符串2] + + 操作符: + + - =:比较字符串内容是否相同 + - !=:比较字符串内容是否不同 + - z:判断字符串内容是否为空 + +二、条件测试语句 + +1. if + + - 单分支 + + 语法: + + ```bash + if [判断条件];then + 需要执行的命令 + fi + + #if表示判断,如果这个变量文件不存在 + + #then表示接下要执行,那么就会执行mkdir -p $DIR + + #fi表示结束 + ``` + + - 双分支 + + 语法 + + ```bash + if [判断条件];then + 需要执行的命令 + else + 条件不成立时需要执行的命令 + fi + ``` + + ```bash + if [判断条件1];then + + 命令序列1 + + elif [判断条件2];then + + 命令序列2 + + elif 判断条件3;then + + 命令序列3 + + else + + 以上条件都为假的命令序列 #托底命令 + fi + ``` + +2. case + + 语法: + + ```bash + case $变量名 in + 模式1) # 判断条件 + 命令1... # 判断为该模式后需要执行的命令 + ;; + 模式2) + 命令2... + ;; + 模式3|模式4) # 可以用'|'分隔多个模式进行联合匹配 + 命令3... + ;; + *) + default_commands... # 匹配所有未明确列出的其他情况(可选) + ;; + esac # 内容的结尾格式,与if语句中的fi类似 + ``` + +三、循环语句 + +1. for循环 + + 语法: + + ```bash + for 变量名 in 取值列表 ;do + 命令序列 + done + + ———————————————————————————————————————————— + + for 变量名 in 取值列表 + do + 命令序列 + done + + -------------------------------------------- + for ((表达式1;表达式2;表达式3)) + do + 命令序列 + done + + #表达式1:定义变量并赋初值 + #表达式2:决定是否循环,正确则循环,不正确直接退出 + #表达式3:决定循环变量如何改变,决定循环什么时候退出 + ``` + +2. while语句 + + 语法: + + ```bash + while 判断条件 + do + 命令1 + done + #语法与if相似 + ``` + +3. until语句 + + ```bash + a=0 + sum=0 + + until [ $a -gt 100] #判断条件。$a大于100则条件为真,会退出循环,若小于100,会陷入循环 + do + sum=$[sum+a] #将当前的a的值累加到sum上 + let a++ #每循环一次,变量值本身+1 + done + echo $sum + ``` + + \ No newline at end of file -- Gitee