diff --git "a/\351\222\237\345\207\244\350\213\261/20240709 MySQL\347\232\204\345\244\207\344\273\275\345\222\214\350\277\230\345\216\237.md" "b/\351\222\237\345\207\244\350\213\261/20240709 MySQL\347\232\204\345\244\207\344\273\275\345\222\214\350\277\230\345\216\237.md" index e5df0d17705b3f3b41eed9854829de3ddf32091f..6007af1c3855e528aeef8e08193fe2b6d64f7fde 100644 --- "a/\351\222\237\345\207\244\350\213\261/20240709 MySQL\347\232\204\345\244\207\344\273\275\345\222\214\350\277\230\345\216\237.md" +++ "b/\351\222\237\345\207\244\350\213\261/20240709 MySQL\347\232\204\345\244\207\344\273\275\345\222\214\350\277\230\345\216\237.md" @@ -49,37 +49,43 @@ #### 3.1 MySQL * **基本命令** -``` +```bash mysqldump -u 用户名 -p 数据库 > backup_file.sql ``` * **完全备份**:使用 `mysqldump` 工具。 - mysqldump -u root -p --all-databases > backup.sql - + ```bash + mysqldump -u root -p --all-databases > backup.sql + ``` * **增量备份**:使用 `binlog`。 - mysqlbinlog binlog.000001 > backup.sql - + ```bash + mysqlbinlog binlog.000001 > backup.sql + ``` + ## 3.2 PostgreSQL * **完全备份**:使用 `pg_dump` 工具。 - pg_dump -U username -F c -b -v -f backup.dump dbname - + ```bash + pg_dump -U username -F c -b -v -f backup.dump dbname + ``` * **增量备份**:使用 `pg_basebackup` 和 `WAL` 日志。 - pg_basebackup -D backup_dir -Ft -z -P - + ```bash + pg_basebackup -D backup_dir -Ft -z -P + ``` + ## 练习题 练习:直接在内网服务器上,向windows主机传递文件(PS:要求必须使用SCP命令),掌握清楚scp命令能成功的前提 + ```bash + scp root@服务器ip:/root/备份文件名称 . ``` - scp root@服务器ip:/root/备份文件名称 - ``` - + diff --git "a/\351\222\237\345\207\244\350\213\261/20240710 Linux\351\207\215\345\256\232\345\220\221\345\222\214\347\256\241\351\201\223\347\254\246.md" "b/\351\222\237\345\207\244\350\213\261/20240710 Linux\351\207\215\345\256\232\345\220\221\345\222\214\347\256\241\351\201\223\347\254\246.md" new file mode 100644 index 0000000000000000000000000000000000000000..6c0cf7e20fb52a392577283ac5cba08e75a1a9d1 --- /dev/null +++ "b/\351\222\237\345\207\244\350\213\261/20240710 Linux\351\207\215\345\256\232\345\220\221\345\222\214\347\256\241\351\201\223\347\254\246.md" @@ -0,0 +1,105 @@ +在Linux系统中,每个进程都有三个标准流:标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。它们分别对应文件描述符 0、1 和 2。以下是关于如何重定向这些标准流的方法: + +### 标准输入重定向(stdin) + +使用 `<` 操作符可以将文件作为命令的标准输入。 + +```bash +command < inputfile +``` + + +### 标准输出重定向(stdout) + +1. 覆盖重定向:使用 `>` 操作符将标准输出重定向到一个文件,如果文件已存在,则覆盖它。 + + command > outputfile + +2. 追加重定向:使用 `>>` 操作符将标准输出追加到一个文件,如果文件已存在,则在文件末尾追加内容。 + + command >> outputfile + + +### 标准错误重定向(stderr) + +1. 覆盖重定向:使用 `2>` 操作符将标准错误重定向到一个文件。 + ```bash + command 2> errorfile + ``` + +2. 追加重定向:使用 `2>>` 操作符将标准错误追加到一个文件。 + + ```bash + command 2>> errorfile +``` + +### 同时重定向标准输出和标准错误 + +1. 使用 `&>` 操作符将标准输出和标准错误同时重定向到一个文件。 + ```bash + command &> outputfile + ```` + + +或者 + + ```bash + command > outputfile 2>&1 + + 这里 `2>&1` 表示将文件描述符 2(标准错误)重定向到文件描述符 1(标准输出)所指向的文件。 + ``` + + +2. 分别重定向后合并:先重定向标准输出,然后将标准错误重定向到标准输出的同一位置。 +```bash +command > outputfile + command 2>&1 >> outputfile +``` + +​ + +### 将标准输出和标准错误输出到不同的文件 + ```bash + command > outputfile 2> errorfile + ``` + +这样,标准输出会写入 `outputfile`,而标准错误会写入 `errorfile`。 + +通过这些重定向方法,可以更灵活地控制命令的输入和输出,特别是在脚本编程和日志管理中非常有用。 + +## 管道符 +管道符 (|) 是Linux命令行中连接两个或多个命令的工具,它将前一个命令的输出作为后一个命令的输入。例如: +```bash +ls -l /home/user | grep "example.txt" +Copy +``` +在这个例子中,ls -l /home/user 命令列出 /home/user 目录下的所有文件和目录。其输出作为 grep "example.txt" 命令的输入,grep 命令则查找并显示包含 "example.txt" 的行。 + +#### 结合使用 +重定向和管道符可以结合起来使用,以实现更复杂的数据处理流程。例如: +```bash +ls -l /home/user | grep "example.txt" | awk '{print $1 " " $5}' +Copy +``` + +在这个例子中,ls -l /home/user 列出 /home/user 目录下的所有文件和目录,输出通过 grep "example.txt" 过滤出包含 "example.txt" 的文件,然后通过 awk 命令进一步处理,输出文件名和文件大小。 + +通过灵活使用重定向和管道符,Linux用户可以构建高效、复杂的命令链,以满足各种数据处理需求。 + +# CQRS +CQRS(Command Query Responsibility Segregation)是一种软件设计模式,它将读取(查询)操作和写入(命令)操作分离,以便它们可以独立地优化和处理。这种模式通常用于复杂或者高性能的应用程序中,特别是在需要高并发处理的系统中。 + +以下是对CQRS的详细解释: + +### 核心概念 + +* **命令(Command)**:代表一个操作,它可能会导致系统状态的变化。例如,创建一个新用户、更新用户信息等操作都是命令。 + +* **查询(Query)**:代表一个不会改变系统状态的操作,它只是返回信息。例如,获取用户信息、搜索产品等操作都是查询。 + +### 工作原理 + +在CQRS模式中,应用程序分为两个部分: +1. **命令侧(Command Side)**:处理所有写操作。当接收到一个写请求时,命令侧会执行相应的命令,并更新数据存储。命令侧通常关注于数据的一致性和事务性。 + +2. **查询侧(Query Side)**:处理所有读操作。它从数据存储中检索信息,但不修改任何数据。查询侧可以优化数据的读取性能,例如通过创建专门的读取模型或索引。 \ No newline at end of file diff --git "a/\351\222\237\345\207\244\350\213\261/20240710 Shell\346\225\231\347\250\213\344\273\245\345\217\212\347\273\203\344\271\240\351\242\230.md" "b/\351\222\237\345\207\244\350\213\261/20240710 Shell\346\225\231\347\250\213\344\273\245\345\217\212\347\273\203\344\271\240\351\242\230.md" new file mode 100644 index 0000000000000000000000000000000000000000..5bbc87ef16dc6a775f3a3ca232f64046a8f230f0 --- /dev/null +++ "b/\351\222\237\345\207\244\350\213\261/20240710 Shell\346\225\231\347\250\213\344\273\245\345\217\212\347\273\203\344\271\240\351\242\230.md" @@ -0,0 +1,285 @@ + +Shell脚本是一种用于自动化任务的脚本语言,它运行在Unix或类Unix操作系统(如Linux)的命令行解释器(Shell)上。Shell脚本通常用于系统管理、文件操作、数据处理等任务。以下是一些基本的Shell脚本编写和使用方法。 + +### 创建和运行Shell脚本 + +1. **创建脚本文件**: 使用文本编辑器创建一个新文件,例如 `myscript.sh`。 + + ```bash + nano myscript.sh + ``` + +2. **添加Shebang**: 在脚本的第一行添加Shebang,指定要使用的Shell解释器。常用的Shebang是 `#!/bin/bash`。 + + ```bash + #!/bin/bash + ``` + +3. **编写脚本内容**: 在脚本文件中编写命令和逻辑。 + + ```bash + #!/bin/bash + echo "Hello, World!" + ``` + +4. **保存并退出编辑器**。 + +5. **赋予执行权限**: 使用 `chmod` 命令赋予脚本执行权限。 + + ```bash + chmod +x myscript.sh + ``` + +6. **运行脚本**: 使用 `./` 前缀运行脚本。 + + ```bash + ./myscript.sh + ``` + + + +### 基本语法和命令 + +1. **变量**: 变量定义和使用。 + + ```bash + #!/bin/bash + myvar="Hello, World!" + echo $myvar + ``` + +2. **用户输入**: 使用 `read` 命令获取用户输入。 + + #!/bin/bash + echo "Enter your name:" + read name + echo "Hello, $name!" + +3. **条件判断**: 使用 `if` 语句进行条件判断。 + + ```bash + #!/bin/bash + if [ $1 == "hello" ]; then + echo "You said hello!" + else + echo "You said something else." + fi + ``` + +4. **循环**: 使用 `for` 或 `while` 循环。 + + #!/bin/bash + for i in 1 2 3 4 5; do + echo "Number: $i" + done + +5. **函数**: 定义和调用函数。 + + ```bash + #!/bin/bash + greet() { + echo "Hello, $1!" + } + greet "Alice" + greet "Bob" + ``` + + + +### 示例:备份文件 + +以下是一个简单的Shell脚本示例,用于备份指定目录中的文件。 + +```bash +#!/bin/bash + +# 定义源目录和目标目录 +source_dir="/path/to/source" +backup_dir="/path/to/backup" + +# 创建备份目录(如果不存在) +mkdir -p $backup_dir + +# 备份文件 +cp -r $source_dir/* $backup_dir + +# 输出备份完成信息 +echo "Backup completed from $source_dir to $backup_dir" +``` + + +### 调试脚本 + +在脚本中添加 `set -x` 可以在执行时显示每条命令及其参数,有助于调试。 + +```bash +#!/bin/bash +set -x +echo "Debugging this script" +``` + + +### 总结 + +Shell脚本是一种强大的工具,用于自动化和简化系统管理任务。通过掌握基本的语法和命令,可以编写出功能丰富的脚本,提高工作效率。 + + + + +练习: + +***1***. for批量创建用户100个用户 + + ``` + + for i in {1..100} + do + useradd user$i + done + + ``` + +***2***. 创建一个存放1-100奇数的数组 +```bash +#!/bin/bash + +# 声明一个数组 +declare -a odd_numbers + +# 循环从1到100 +for ((i=1; i<=100; i++)); do + # 判断是否为奇数 + if ((i % 2 != 0)); then + # 如果是奇数,则添加到数组中 + odd_numbers+=($i) + fi +done + +# 打印奇数数组 +echo "Odd numbers array: ${odd_numbers[*]}" + +``` +**注意**:"Odd numbers array"可以取任何名字,除了*号,还可以是@符号 + + +***3***. 猜数字游戏:开始生成一个100以内的正整数,给10次机会猜数字,如果没有猜对,则提示小了或者大了,如果猜对了,提示恭喜,全部次数用完都没有猜对,则显示“很遗憾” +```bash +#!/bin/bash + +# 生成一个1到100之间的随机整数作为目标数字 +target_number=$((RANDOM % 100 + 1)) + +# 初始化猜测次数 +guess_count=0 + +# 设置最大猜测次数 +max_guesses=7 + +# 打印游戏说明 +echo "哈喽笨猪健健,欢迎来到猜数字游戏快乐向前冲!!答对大冰箱一台!" +echo "游戏是猜测1到100之间的数字,你能行吗?快乐向前冲,冰箱等你拿!" +echo "你总共有${max_guesses}次机会。" + +# 开始游戏循环 +while [ $guess_count -lt $max_guesses ]; do + # 读取玩家的猜测 + read -p "请输入你的猜测: " guess + + # 将猜测转换为整数 + guess=$((guess)) + + # 增加猜测次数 + guess_count=$((guess_count + 1)) + + # 检查猜测 + if [ $guess -eq $target_number ]; then + echo "恭喜你!你猜对了数字${target_number},总共猜了${guess_count}次。" + exit 0 + elif [ $guess -lt $target_number ]; then + echo "太小了!请小钟给健健一巴掌~ 再试一次。" + else + echo "太大了!请健健给健健一耳光+两巴掌~~" + fi +done + +# 如果猜测次数达到最大次数仍未猜中 +echo "很遗憾,你没有在${max_guesses}次内猜中数字${target_number}。游戏结束。看来大冰箱与你无缘~" + +``` + +***4***. 显示一张99乘法表 +```bash +#!/bin/bash + +for i in {1..9}; do + for j in {1..9}; do + # 使用printf保证输出对齐 + printf "%d*%d=%-2d " $i $j $((i*j)) + done + echo +done +``` +**注意**:printf命令用于格式化输出,%-2d表示左对齐并保留至少两个字符的宽度,这样可以让输出更加整齐 + +***5***. 打印一个等腰三角形 +```bash +#!/bin/bash + +# 定义三角形的高度 +height=5 + +for ((i = 1; i <= height; i++)); do + for ((j = height - i; j >= 1; j--)); do + printf " " + done + for ((k = 1; k <= 2 * i - 1; k++)); do + printf "*" + done + printf "\\n" +done +``` + +***6***. 抽奖游戏,50个人,抽奖,要求抽出5个三等奖、3个二等奖、1个一等奖,要求不能重复,中奖过的人不能重复中奖,结果生成在文件中 +```bash +#!/bin/bash + +# 初始化参与者数组 +participants=() +for (( i=1; i<=50; i++ )); do + participants+=("$i") +done + +# 抽取奖项 +# 定义一个函数来抽取奖项,并更新参与者数组 +function draw_prize { + local prize_count=$1 + local prize_name=$2 + local result_file=$3 + + for (( j=0; j<$prize_count; j++ )); do + # 随机选择一个索引 + index=$((RANDOM % ${#participants[@]})) + # 抽取中奖者 + winner=${participants[$index]} + # 将中奖者添加到结果文件中 + echo "$prize_name: $winner" >> "$result_file" + # 从参与者数组中移除该中奖者 + unset 'participants[$index]' + # 重新索引数组 + participants=("${participants[@]}") + done +} + +# 结果文件 +result_file="draw_results.txt" + +# 清空结果文件 +> "$result_file" + +# 抽取奖项 +draw_prize 5 "三等奖" "$result_file" +draw_prize 3 "二等奖" "$result_file" +draw_prize 1 "一等奖" "$result_file" + +echo "抽奖结果已保存在 $result_file" +``` \ No newline at end of file diff --git "a/\351\222\237\345\207\244\350\213\261/20240710 \346\225\260\346\215\256\345\272\223\347\232\204\344\270\273\344\273\216\345\244\215\345\210\266.md" "b/\351\222\237\345\207\244\350\213\261/20240710 \346\225\260\346\215\256\345\272\223\347\232\204\344\270\273\344\273\216\345\244\215\345\210\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..12e49d3ba34a1622f8c00ca987d24ba3cf65f3f0 --- /dev/null +++ "b/\351\222\237\345\207\244\350\213\261/20240710 \346\225\260\346\215\256\345\272\223\347\232\204\344\270\273\344\273\216\345\244\215\345\210\266.md" @@ -0,0 +1,116 @@ + +数据库的主从复制(以项目形式出现) + +### 主从复制(Master-Slave Replication)是数据库系统中的一种数据复制方式,用于提高数据可用性和容错性。在主从复制中,有一个主数据库(Master)负责接收所有的写入操作,而一个或多个从数据库(Slave)则用于读取操作和备份。 + +### 主从复制的原理 + +1. #### 写操作:所有的写操作都发生在主数据库上。当一个写操作完成时,主数据库会立即将这条数据更新同步到从数据库。 + +2. #### 读操作:从数据库用于处理所有读操作。这可以显著提高系统的并发性能,因为读操作通常比写操作更频繁,而且不需要实时更新。 + +3. #### 同步机制:主数据库和从数据库之间通过某种机制保持数据的一致性。这通常涉及到将主数据库的日志文件(记录所有写操作的文件)复制到从数据库,然后从数据库执行这些日志文件中的操作,以保证数据的一致性。 + +以下是一个使用MySQL数据库进行主从复制的具体示例 + +### 前提条件 + +* 两个服务器:一个作为主服务器(Master),另一个作为从服务器(Slave)。 +* 主服务器上已经安装并配置了MySQL数据库。 +* 从服务器上已经安装并配置了MySQL数据库。 + +### 主服务器配置 + +1. **开启二进制日志**: + + 在主服务器的MySQL配置文件(通常是`my.cnf`或`my.ini`)中,添加或修改以下行: + + ```bash + [mysqld] + log-bin=/path/to/binlog + server-id=1 + ``` + + + 其中`server-id`是唯一的,用于区分不同的服务器。 + +2. **创建复制用户**: + + 登录到主服务器上的MySQL: + + ```bash + mysql -u root -p + ``` + + + 执行以下SQL命令创建一个用于复制的用户: + + ```bash + CREATE USER 'replication_user'@'%' IDENTIFIED BY 'replication_password'; + GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%'; + FLUSH PRIVILEGES; + ``` + + + +### 从服务器配置 + +1. **配置从服务器**: + + 登录到从服务器上的MySQL: + + ```bash + mysql -u root -p + ``` + + + 执行以下命令设置从服务器的主机信息、端口、用户和密码: + + ```bash + CHANGE MASTER TO + MASTER_HOST='主服务器IP', + MASTER_USER='replication_user', + MASTER_PASSWORD='replication_password', + MASTER_LOG_FILE='主服务器binlog文件名', + MASTER_LOG_POS=binlog文件中的位置; + ``` + + + 其中,`主服务器IP`是主服务器的IP地址,`主服务器binlog文件名`和`binlog文件中的位置`需要通过以下命令获取: + + ```bash + -- 在主服务器上获取 + SHOW MASTER STATUS; + ``` + +2. **启动复制**: + + 在从服务器上执行以下命令来启动复制进程: + + ```bash + START SLAVE; + ``` + + + +### 检查复制状态 + +在从服务器上检查复制状态: + +```bash +SHOW SLAVE STATUS\\G +``` + + +检查以下字段: + +* `Slave_IO_Running` 应该是 `Yes`。 +* `Slave_SQL_Running` 也应该是 `Yes`。 + +### 注意事项 + +* 确保主从服务器的时间同步。 +* 定期检查主从服务器的状态,确保复制正常进行。 +* 如果需要,可以设置从服务器为只读模式,以防止意外写入。 + +通过以上步骤,您就可以在MySQL数据库中设置一个主从复制环境。这只是一个基本的示例,实际部署时可能需要考虑更多的配置和优化。 \ No newline at end of file