diff --git "a/\350\265\226\345\277\203\345\246\215/20240606 PacVim \344\270\216 SSL\350\257\201\344\271\246 - nginx.md" "b/\350\265\226\345\277\203\345\246\215/20240606 PacVim \344\270\216 SSL\350\257\201\344\271\246 - nginx.md" index 64015cf0ceddcd80eab955157e9134cdb92bdd2b..50d2951cfbd94b8f9631e20f5df244dd2fcff3b7 100644 --- "a/\350\265\226\345\277\203\345\246\215/20240606 PacVim \344\270\216 SSL\350\257\201\344\271\246 - nginx.md" +++ "b/\350\265\226\345\277\203\345\246\215/20240606 PacVim \344\270\216 SSL\350\257\201\344\271\246 - nginx.md" @@ -70,7 +70,7 @@ server { ```bash # 在nginx执行目录下执行命令 -sbin/nginx -t +/sbin/nginx -t # 但是执行目录也有可能在/etc/nginx # 所以可以进入/etc/nginx执行命令 diff --git "a/\350\265\226\345\277\203\345\246\215/20240624 \345\256\211\350\243\205apache.md" "b/\350\265\226\345\277\203\345\246\215/20240624 \345\256\211\350\243\205apache.md" new file mode 100644 index 0000000000000000000000000000000000000000..45db730fdb07f6198d9b619a6e273052fc0931bd --- /dev/null +++ "b/\350\265\226\345\277\203\345\246\215/20240624 \345\256\211\350\243\205apache.md" @@ -0,0 +1,57 @@ +## 安装apache + +先将网页文件备份,因为安装apache会将nginx覆盖 + +安装Apache + +```bash +apt update +apt install apache2 +``` + +因为原先安装nginx所以需要更改nginx端口或者更改apache端口 + +```bash +# 进入配置文件 +cd /etc/nginx +# 因为配置独立分开,所以配置文件不是nginx.conf,而是conf.d/域名.conf +# 将端口更改为8080 +``` + +![858f226ac1424827598bd23d8e788d9](assets/20.png) + +```bash +# 保存退出后测试配置文件并重启nginx服务 +/sbin/nginx -t +systemctl restart nginx +``` + +华为云添加安全组 + +控制台 - 安全组 + +![c29573ba1058e3ecbc072ada2d78bdc](assets/21.png) + +选择安全组 + +点击配置规则 + +![770b2fda0a02caf1730a1180f55e1eb](assets/22.png) + +点击快速添加规则 + +![c75bfb24c26ec247b9f38564ab7477d](assets/23.png) + +选择相应端口号添加即可 + +```bash +# nginx配置过ssl证书,做了https与http的重定向 +# 用http协议打开网页加上端口号可以访问 +# 但是https不行,因为暂时没有找到https更改端口号的方法,https默认端口号为443 +``` + +## 安装防火墙utw + +```bash +apt install utw +``` diff --git "a/\350\265\226\345\277\203\345\246\215/20240701 apache\343\200\201mysql\343\200\201postgresql.md" "b/\350\265\226\345\277\203\345\246\215/20240701 apache\343\200\201mysql\343\200\201postgresql.md" new file mode 100644 index 0000000000000000000000000000000000000000..a3c01d3046e877a78929b2a41f51f9d740d43394 --- /dev/null +++ "b/\350\265\226\345\277\203\345\246\215/20240701 apache\343\200\201mysql\343\200\201postgresql.md" @@ -0,0 +1,214 @@ +## apache 添加二级域名 + +### 华为云域名解析添加新的域名解析 + +#### 点击云解析服务DNS + +![25](assets/24.PNG) + +#### 点击管理解析 + +![26](assets/25.PNG) + +#### 点击添加记录集 + +![27](assets/26.PNG) + +#### 将主机记录填写新的二级域名(别名) + +![28](assets/27.PNG) + +#### 配置apache文件 + +```bash +# 进入apache配置文件的目录 +cd /etc/apache2/sites-available +# 修改配置文件000-default.conf +``` + +![29](assets/28.PNG) + +#### 测试重启服务 + +```bash +# 测试apache服务 +apache2ctl configtest +# 重启apache服务 +systemctl restart apache2 +``` + +#### 最后查看网页别名+域名 + +```bash +jh.leejaehyunow.top +``` + +可能会出现443端口冲突,记得在ports.conf将端口改成其他 + +## apache 配置SSL证书 + +#### 上传证书文件到指定路径 + +``` +# 连接 +sftp root@60.204.154.55 +# 找到路径 +``` + +可以在apache2里新建一个文件夹ssl将密钥文件放进去 + +![](assets/29.png) + +#### 修改apache配置文件 + +sites-available目录下的000-default.conf文件 + +![31](assets/30.png) + +```bash +# 安装证书 +SSLEngine on +SSLCertificateFile /etc/apache2/ssl/server.crt +SSLCertificateKeyFile /etc/apache2/ssl/server.key +``` + +在apache2.conf文件最后一行添加内容 + +![bf4ed8fca05f89876e6322c0d419711](assets/31.png) + +``` +LoadModule ssl_module modules/mod_ssl.so +``` + +#### 开启ssl模块 + +```bash +a2enmod ssl +``` + +使用https访问二级域名会显示不安全,因为一个ssl证书只能绑定一个域名,所以如果要给二级域名绑定ssl证书需要再申请 + +## 安装MySQL + +#### 下载MySQL + +这个是下载mysql所以建议选好位置,可以在家目录操作 + +```bash +wget https://dev.mysql.com/get/mysql-apt-config_0.8.30-1_all.deb +dpkg -i mysql-apt-config_0.8.30-1_all.deb +``` + +#### 安装MySQL + +```bash +apt update +apt install mysql-server +``` + +如果出现报错找不到mysql-server包可以试试替换一下仓库源 + +```bash +# 进入软件源目录 +cd /etc/apt/ + +# 修改sources.list文件 +vim sources.list + +# 将内容替换 +deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free +deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free +deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free +deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free +deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free +deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free +deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free +deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free +``` + +![b0d51178867d47b4c5f72094e5f8973](assets/32.png) + +![806a34133e4295731bc003d713c1dca](assets/33.png) + +![309c75e5b444a601b9401b9a0658f62](assets/34.png) + +安装过程中会显示设置mysql root密码 + +#### 连接数据库 + +```bash +mysql -u root -p +``` + +## MySQL 连接远程 + +#### 进入mysql + +```bash +mysql -u root -p +``` + +#### 添加权限 + +```mysql +use mysql; +# 查看用户 +select user,host from user; +# 修改用户权限 +update user set host='%' where user='root'; +grant all privileges on *.* to 'root'@'%' with grant option; +# 更新列表 +flush privileges; +``` + +可以用native连接或者cmd连接试试 + +```bash +# cmd 连接 mysql 命令 +mysql -h 域名或ip -P mysql端口号 -u mysql用户名 -p +``` + +##### 若连接不上去华为云设置安全组添加规则 + +## 安装postgresql + +```bash +apt update +apt install postgresql -y +# 验证postgresql版本 +sudo -u postgres psql -c "SELECT version();" +# 不报错就可以啦 +``` + +```bash +# 配置postgresql + +# 切换到postgres用户 +sudo -i -u postgres +# 进入postgreSQL shell +psql +# 修改postgres的密码 +ALTER USER postgres PASSWORD '新密码'; +#退出postgreSQL shell +\q +``` + +## postgresql 远程连接 + +```bash +# 进入postgresql配置文件目录 +cd /etc/postgresql/13/main/ +# 修改配置文件postgresql.conf +listen_addresses = '*' +``` + +![image-20240703130847220](assets/35.png) + +```bash +# 修改配置文件pg_hba.conf +host all all 0.0.0.0/0 md5 +``` + +![78a4e7cca3379154369bf941cde70f6](assets/36.png) + +如果显示连接不了可以去华为云安全组添加规则 diff --git "a/\350\265\226\345\277\203\345\246\215/20240704 \346\225\260\346\215\256\345\272\223\347\232\204\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215.md" "b/\350\265\226\345\277\203\345\246\215/20240704 \346\225\260\346\215\256\345\272\223\347\232\204\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215.md" new file mode 100644 index 0000000000000000000000000000000000000000..531fa8d83ddffa68268a98662e2c0a638377fcc0 --- /dev/null +++ "b/\350\265\226\345\277\203\345\246\215/20240704 \346\225\260\346\215\256\345\272\223\347\232\204\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215.md" @@ -0,0 +1,776 @@ +## 数据库的备份与恢复 + +### 数据的备份类型 + +数据的备份类型根据其自身的特性主要分为以下几组 + +- 完全备份 + +- 部分备份 + + 完全备份指的是**备份整个数据集( 即整个数据库 )**、部分备份指的是**备份部分数据集(例如: 只备份一个表)** + +而部分备份又分为以下两种 + +- 增量备份 + +- 差异备份 + + 增量备份指的是**备份自上一次备份以来(增量或完全)以来变化的数据**; 特点: 节约空间、还原麻烦 + 差异备份指的是**备份自上一次完全备份以来变化的数据** 特点: 浪费空间、还原比增量备份简单 + +### **MySQL备份数据的方式** + +在`MySQl`中我们备份数据一般有几种方式 + +- 热备份 + +- 温备份 + +- 冷备份 + + 热备份指的是当数据库进行备份时, **数据库的读写操作均不是受影响** + 温备份指的是当数据库进行备份时, **数据库的读操作可以执行, 但是不能执行写操作** + 冷备份指的是当数据库进行备份时, **数据库不能进行读写操作, 即数据库要下线** + +`MySQL`中进行不同方式的备份还要考虑存储引擎是否支持 + +- MyISAM + + 热备 × + + 温备 √ + + 冷备 √ + +- InnoDB + + 热备 √ + + 温备 √ + + 冷备 √ + + 我们在考虑完数据在备份时, 数据库的运行状态之后还需要考虑对于`MySQL`数据库中数据的备份方式 + + 物理备份一般就是**通过****`tar`,`cp`等命令直接打包复制数据库的数据文件**达到备份的效果 + 逻辑备份一般就是**通过特定工具从数据库中导出数据并另存备份**(逻辑备份会丢失数据精度) + +- - 物理备份 + + - 逻辑备份 + + **备份工具** + + 这里我们列举出常用的几种备份工具 + `mysqldump` : 逻辑备份工具, 适用于所有的存储引擎, 支持温备、完全备份、部分备份、对于**InnoDB**存储引擎支持热备 + `cp, tar 等归档复制工具`: 物理备份工具, 适用于所有的存储引擎, 冷备、完全备份、部分备份 + `lvm2 snapshot`: 几乎热备, 借助文件系统管理工具进行备份 + `mysqlhotcopy`: 名不副实的的一个工具, 几乎冷备, 仅支持**MyISAM**存储引擎 + `xtrabackup`: 一款非常强大的**InnoDB/XtraDB**热备工具, 支持完全备份、增量备份, 由`percona`提供 + +> - ### 设计合适的备份策略 + +> 针对不同的场景下, 我们应该制定不同的备份策略对数据库进行备份, 一般情况下, 备份策略一般为以下三种 +> +> - **直接cp,tar复制数据库文件** +> - **mysqldump+复制BIN LOGS** +> - **lvm2快照+复制BIN LOGS** +> - **xtrabackup** +> +> 以上的几种解决方案分别针对于不同的场景 +> +> 1. 如果数据量较小, 可以使用第一种方式, 直接复制数据库文件 +> 2. 如果数据量还行, 可以使用第二种方式, 先使用mysqldump对数据库进行完全备份, 然后定期备份BINARY LOG达到增量备份的效果 +> 3. 如果数据量一般, 而又不过分影响业务运行, 可以使用第三种方式, 使用`lvm2`的快照对数据文件进行备份, 而后定期备份BINARY LOG达到增量备份的效果 +> 4. 如果数据量很大, 而又不过分影响业务运行, 可以使用第四种方式, 使用`xtrabackup`进行完全备份后, 定期使用`xtrabackup`进行增量备份或差异备份 + +## 实战演练 + +### 使用cp进行备份 + +> 我们这里使用的是使用yum安装的`mysql-5.1`的版本, 使用的数据集为从网络上找到的一个员工数据库 + +**查看数据库的信息** + +```sql +mysql> SHOW DATABASES; #查看当前的数据库, 我们的数据库为employees ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| employees | +| mysql | +| test | ++--------------------+ +4 rows in set (0.00 sec) + +mysql> USE employees; +Database changed +mysql> SHOW TABLES; #查看当前库中的表 ++---------------------+ +| Tables_in_employees | ++---------------------+ +| departments | +| dept_emp | +| dept_manager | +| employees | +| salaries | +| titles | ++---------------------+ +6 rows in set (0.00 sec) + +mysql> SELECT COUNT(*) FROM employees; #由于篇幅原因, 我们这里只看一下employees的行数为300024 ++----------+ +| COUNT(*) | ++----------+ +| 300024 | ++----------+ +1 row in set (0.05 sec) +``` + +**向数据库施加读锁** + +```sql +mysql> FLUSH TABLES WITH READ LOCK; #向所有表施加读锁 +Query OK, 0 rows affected (0.00 sec) +``` + +**备份数据文件** + +```csharp +[root@node1 ~]# mkdir /backup #创建文件夹存放备份数据库文件 +[root@node1 ~]# cp -a /var/lib/mysql/* /backup #保留权限的拷贝源数据文件 +[root@node1 ~]# ls /backup #查看目录下的文件 +employees ibdata1 ib_logfile0 ib_logfile1 mysql mysql.sock test +``` + +**模拟数据丢失并恢复** + +```sql +[root@node1 ~]# rm -rf /var/lib/mysql/* #删除数据库的所有文件 +[root@node1 ~]# service mysqld restart #重启MySQL, 如果是编译安装的应该不能启动, 如果rpm安装则会重新初始化数据库 + + +mysql> SHOW DATABASES; #因为我们是rpm安装的, 连接到MySQL进行查看, 发现数据丢失了! ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| test | ++--------------------+ +3 rows in set (0.00 sec) + +[root@node1 ~]# rm -rf /var/lib/mysql/* #这一步可以不做 +[root@node1 ~]# cp -a /backup/* /var/lib/mysql/ #将备份的数据文件拷贝回去 +[root@node1 ~]# service mysqld restart #重启MySQL + + +#重新连接数据并查看 + +mysql> SHOW DATABASES; #数据库已恢复 ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| employees | +| mysql | +| test | ++--------------------+ +4 rows in set (0.00 sec) + +mysql> USE employees; + +mysql> SELECT COUNT(*) FROM employees; #表的行数没有变化 ++----------+ +| COUNT(*) | ++----------+ +| 300024 | ++----------+ +1 row in set (0.06 sec) + + +##完成 +``` + +### 使用mysqldump+复制BINARY LOG备份 + +> 我们这里使用的是使用yum安装的`mysql-5.1`的版本, 使用的数据集为从网络上找到的一个员工数据库 +> +> 我们通过mysqldump进行一次完全备份, 再修改表中的数据, 然后再通过binary log进行恢复 **二进制日志需要在mysql配置文件中添加 log_bin=on 开启** + +**`mysqldump`命令介绍** + +> `mysqldump`是一个客户端的逻辑备份工具, 可以生成一个重现创建原始数据库和表的SQL语句, 可以支持所有的存储引擎, 对于InnoDB支持热备 +> +> [官方文档介绍](http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html) + +```css +#基本语法格式 + +shell> mysqldump [options] db_name [tbl_name ...] 恢复需要手动CRATE DATABASES +shell> mysqldump [options] --databases db_name ... 恢复不需要手动创建数据库 +shell> mysqldump [options] --all-databases 恢复不需要手动创建数据库 + + +其他选项: + -E, --events: 备份事件调度器 + -R, --routines: 备份存储过程和存储函数 + --triggers: 备份表的触发器; --skip-triggers + --master-date[=value] + 1: 记录为CHANGE MASTER TO 语句、语句不被注释 + 2: 记录为注释的CHANGE MASTER TO语句 + 基于二进制还原只能全库还原 + + --flush-logs: 日志滚动 + 锁定表完成后执行日志滚动 +``` + +**查看数据库的信息** + +```sql +mysql> SHOW DATABASES; #查看当前的数据库, 我们的数据库为employees ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| employees | +| mysql | +| test | ++--------------------+ +4 rows in set (0.00 sec) + +mysql> USE employees; +Database changed +mysql> SHOW TABLES; #查看当前库中的表 ++---------------------+ +| Tables_in_employees | ++---------------------+ +| departments | +| dept_emp | +| dept_manager | +| employees | +| salaries | +| titles | ++---------------------+ +6 rows in set (0.00 sec) + +mysql> SELECT COUNT(*) FROM employees; #由于篇幅原因, 我们这里只看一下employees的行数为300024 ++----------+ +| COUNT(*) | ++----------+ +| 300024 | ++----------+ +1 row in set (0.05 sec) +``` + +**使用`mysqldump`备份数据库** + +```sql +[root@node1 ~]# mysql -uroot -p -e 'SHOW MASTER STATUS' #查看当前二进制文件的状态, 并记录下position的数字 ++------------------+----------+--------------+------------------+ +| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | ++------------------+----------+--------------+------------------+ +| mysql-bin.000003 | 106 | | | ++------------------+----------+--------------+------------------+ + +[root@node1 ~]# mysqldump --all-databases --lock-all-tables > backup.sql #备份数据库到backup.sql文件中 + +mysql> CREATE DATABASE TEST1; #创建一个数据库 +Query OK, 1 row affected (0.00 sec) + +mysql> SHOW MASTER STATUS; #记下现在的position ++------------------+----------+--------------+------------------+ +| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | ++------------------+----------+--------------+------------------+ +| mysql-bin.000003 | 191 | | | ++------------------+----------+--------------+------------------+ +1 row in set (0.00 sec) + +[root@node1 ~]# cp /var/lib/mysql/mysql-bin.000003 /root #备份二进制文件 +[root@node1 ~]# service mysqld stop #停止MySQL +[root@node1 ~]# rm -rf /var/lib/mysql/* #删除所有的数据文件 +[root@node1 ~]# service mysqld start #启动MySQL, 如果是编译安装的应该不能启动(需重新初始化), 如果rpm安装则会重新初始化数据库 + + +mysql> SHOW DATABASES; #查看数据库, 数据丢失! ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| test | ++--------------------+ +3 rows in set (0.00 sec) + +mysql> SET sql_log_bin=OFF; #暂时先将二进制日志关闭 +Query OK, 0 rows affected (0.00 sec) + + +mysql> source backup.sql #恢复数据,所需时间根据数据库时间大小而定 + +mysql> SET sql_log_bin=ON; 开启二进制日志 + +mysql> SHOW DATABASES; #数据库恢复, 但是缺少TEST1 ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| employees | +| mysql | +| test | ++--------------------+ +4 rows in set (0.00 sec) + +[root@node1 ~]# mysqlbinlog --start-position=106 --stop-position=191 mysql-bin.000003 | mysql employees #通过二进制日志增量恢复数据 + +mysql> SHOW DATABASES; #现在TEST1出现了! ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| TEST1 | +| employees | +| mysql | +| test | ++--------------------+ +5 rows in set (0.00 sec) + + + +#完成 +``` + +### 使用lvm2快照备份数据 + +> 做实验之前我们先回顾一下`lvm2-snapshot`的知识 +> +> `LVM`快照简单来说就是将所快照源分区一个时间点所有文件的元数据进行保存,如果源文件没有改变,那么访问快照卷的相应文件则直接指向源分区的源文件,如果源文件发生改变,则快照卷中与之对应的文件不会发生改变。快照卷主要用于辅助备份文件。 这里只简单介绍,[点击查看详细介绍](http://www.360doc.com/content/13/0522/16/11801283_287305129.shtml) + +**部署lvm环境** + +```perl +添加硬盘; 这里我们直接实现SCSI硬盘的热插拔, 首先在虚拟机中添加一块硬盘, 不重启 + +[root@node1 ~]# ls /dev/sd* #只有以下几块硬盘, 但是我们不重启可以让系统识别新添加的硬盘 +/dev/sda /dev/sda1 /dev/sda2 + +[root@node1 ~]# echo '- - -' > /sys/class/scsi_host/host0/scan +[root@node1 ~]# echo '- - -' > /sys/class/scsi_host/host1/scan +[root@node1 ~]# echo '- - -' > /sys/class/scsi_host/host2/scan + +[root@node1 ~]# ls /dev/sd* #看!sdb识别出来了 +/dev/sda /dev/sda1 /dev/sda2 /dev/sdb + + +[root@node1 ~]# fdisk /dev/sdb #分区 +Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel +Building a new DOS disklabel with disk identifier 0xd353d192. +Changes will remain in memory only, until you decide to write them. +After that, of course, the previous content won't be recoverable. + +Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) + +WARNING: DOS-compatible mode is deprecated. It's strongly recommended to + switch off the mode (command 'c') and change display units to + sectors (command 'u'). + +Command (m for help): n +Command action + e extended + p primary partition (1-4) +p +Partition number (1-4): 1 +First cylinder (1-2610, default 1): +Using default value 1 +Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +15G + +Command (m for help): t +Selected partition 1 +Hex code (type L to list codes): 8e +Changed system type of partition 1 to 8e (Linux LVM) + +Command (m for help): w +The partition table has been altered! + +Calling ioctl() to re-read partition table. +Syncing disks. +You have new mail in /var/spool/mail/root +[root@node1 ~]# partx -a /dev/sdb +BLKPG: Device or resource busy +error adding partition 1 + +##创建逻辑卷 +[root@node1 ~]# pvcreate /dev/sdb1 + Physical volume "/dev/sdb1" successfully created +[root@node1 ~]# vgcreate myvg /dev/sdb1 + Volume group "myvg" successfully created +[root@node1 ~]# lvcreate -n mydata -L 5G myvg + Logical volume "mydata" created. + +[root@node1 ~]# mkfs.ext4 /dev/mapper/myvg-mydata #格式化 +[root@node1 ~]# mkdir /lvm_data +[root@node1 ~]# mount /dev/mapper/myvg-mydata /lvm_data #挂载到/lvm_data + + +[root@node1 ~]# vim /etc/my.cnf #修改mysql配置文件的datadir如下 + +datadir=/lvm_data + +[root@node1 ~]# service mysqld restart #重启MySQL + +####重新导入employees数据库########略过#### +``` + +**查看数据库的信息** + +```sql +mysql> SHOW DATABASES; #查看当前的数据库, 我们的数据库为employees ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| employees | +| mysql | +| test | ++--------------------+ +4 rows in set (0.00 sec) + +mysql> USE employees; +Database changed +mysql> SHOW TABLES; #查看当前库中的表 ++---------------------+ +| Tables_in_employees | ++---------------------+ +| departments | +| dept_emp | +| dept_manager | +| employees | +| salaries | +| titles | ++---------------------+ +6 rows in set (0.00 sec) + +mysql> SELECT COUNT(*) FROM employees; #由于篇幅原因, 我们这里只看一下employees的行数为300024 ++----------+ +| COUNT(*) | ++----------+ +| 300024 | ++----------+ +1 row in set (0.05 sec) +``` + +**创建快照卷并备份** + +```perl +mysql> FLUSH TABLES WITH READ LOCK; #锁定所有表 +Query OK, 0 rows affected (0.00 sec) + +[root@node1 lvm_data]# lvcreate -L 1G -n mydata-snap -p r -s /dev/mapper/myvg-mydata #创建快照卷 + Logical volume "mydata-snap" created. + +mysql> UNLOCK TABLES; #解锁所有表 +Query OK, 0 rows affected (0.00 sec) + +[root@node1 lvm_data]# mkdir /lvm_snap #创建文件夹 +[root@node1 lvm_data]# mount /dev/myvg/mydata-snap /lvm_snap/ #挂载snap +mount: block device /dev/mapper/myvg-mydata--snap is write-protected, mounting read-only + +[root@node1 lvm_data]# cd /lvm_snap/ +[root@node1 lvm_snap]# ls +employees ibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 mysql-bin.index test +[root@node1 lvm_snap]# tar cf /tmp/mysqlback.tar * #打包文件到/tmp/mysqlback.tar + +[root@node1 ~]# umount /lvm_snap/ #卸载snap +[root@node1 ~]# lvremove myvg mydata-snap #删除snap +``` + +**恢复数据** + +```sql +[root@node1 lvm_snap]# rm -rf /lvm_data/* +[root@node1 ~]# service mysqld start #启动MySQL, 如果是编译安装的应该不能启动(需重新初始化), 如果rpm安装则会重新初始化数据库 + + +mysql> SHOW DATABASES; #查看数据库, 数据丢失! ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| test | ++--------------------+ +3 rows in set (0.00 sec) + +[root@node1 ~]# cd /lvm_data/ +[root@node1 lvm_data]# rm -rf * #删除所有文件 +[root@node1 lvm_data]# tar xf /tmp/mysqlback.tar #解压备份数据库到此文件夹 +[root@node1 lvm_data]# ls #查看当前的文件 +employees ibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 mysql-bin.index test + +mysql> SHOW DATABASES; #数据恢复了 ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| employees | +| mysql | +| test | ++--------------------+ +4 rows in set (0.00 sec) + + +##完成 +``` + +### 使用Xtrabackup备份 + +> 为了更好地演示, 我们这次使用`mariadb-5.5`的版本, 使用`xtrabackup`使用InnoDB能够发挥其最大功效, 并且InnoDB的每一张表必须使用单独的表空间, 我们需要在配置文件中添加 `innodb_file_per_table = ON` 来开启 + +**下载安装`xtrabackup`** + +```cpp +我们这里通过wget percona官方的rpm包进行安装 +[root@node1 ~]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.3.4/binary/redhat/6/x86_64/percona-xtrabackup-2.3.4-1.el6.x86_64.rpm +[root@node1 ~]# yum localinstall percona-xtrabackup-2.3.4-1.el6.x86_64.rpm #需要EPEL源 +``` + +**`xtrabackup`介绍** + +> `Xtrabackup`是由`percona`提供的`mysql`数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点: +> +> 1. 备份过程快速、可靠; +> 2. 备份过程不会打断正在执行的事务; +> 3. 能够基于压缩等功能节约磁盘空间和流量; +> 4. 自动实现备份检验; +> 5. 还原速度快; +> +> **摘自马哥的文档** + +**`xtrabackup`实现完全备份** + +> 我们这里使用`xtrabackup`的前端配置工具`innobackupex`来实现对数据库的完全备份 +> +> 使用`innobackupex`备份时, 会调用`xtrabackup`备份所有的**InnoDB**表, 复制所有关于表结构定义的相关文件(.frm)、以及**MyISAM**、**MERGE**、**CSV**和**ARCHIVE**表的相关文件, 同时还会备份触发器和数据库配置文件信息相关的文件, 这些文件会被保存至一个以时间命名的目录. + +**备份过程** + +```csharp +[root@node1 ~]# mkdir /extrabackup #创建备份目录 +[root@node1 ~]# innobackupex --user=root /extrabackup/ #备份数据 +###################提示complete表示成功********************* + +[root@node1 ~]# ls /extrabackup/ #看到备份目录 +2016-04-27_07-30-48 +``` + +> 一般情况, 备份完成后, 数据不能用于恢复操作, 因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此, 此时的数据文件仍不一致, 所以我们需要”准备”一个完全备份 + +```cpp +[root@node1 ~]# innobackupex --apply-log /extrabackup/2016-04-27_07-30-48/ #指定备份文件的目录 + +#一般情况下下面三行结尾代表成功***************** +InnoDB: Starting shutdown... +InnoDB: Shutdown completed; log sequence number 369661462 +160427 07:40:11 completed OK! + +[root@node1 ~]# cd /extrabackup/2016-04-27_07-30-48/ +[root@node1 2016-04-27_07-30-48]# ls -hl #查看备份文件 +total 31M +-rw-r----- 1 root root 386 Apr 27 07:30 backup-my.cnf +drwx------ 2 root root 4.0K Apr 27 07:30 employees +-rw-r----- 1 root root 18M Apr 27 07:40 ibdata1 +-rw-r--r-- 1 root root 5.0M Apr 27 07:40 ib_logfile0 +-rw-r--r-- 1 root root 5.0M Apr 27 07:40 ib_logfile1 +drwx------ 2 root root 4.0K Apr 27 07:30 mysql +drwx------ 2 root root 4.0K Apr 27 07:30 performance_schema +drwx------ 2 root root 4.0K Apr 27 07:30 test +-rw-r----- 1 root root 27 Apr 27 07:30 xtrabackup_binlog_info +-rw-r--r-- 1 root root 29 Apr 27 07:40 xtrabackup_binlog_pos_innodb +-rw-r----- 1 root root 117 Apr 27 07:40 xtrabackup_checkpoints +-rw-r----- 1 root root 470 Apr 27 07:30 xtrabackup_info +-rw-r----- 1 root root 2.0M Apr 27 07:40 xtrabackup_logfile +``` + +**恢复数据** + +```haskell +[root@node1 ~]# rm -rf /data/* #删除数据文件 + +***不用启动数据库也可以还原************* + +[root@node1 ~]# innobackupex --copy-back /extrabackup/2016-04-27_07-30-48/ #恢复数据, 记清使用方法 + +#########我们这里是编译安装的mariadb所以需要做一些操作########## +[root@node1 data]# killall mysqld + +[root@node1 ~]# chown -R mysql:mysql ./* +[root@node1 ~]# ll /data/ #数据恢复 +total 28704 +-rw-rw---- 1 mysql mysql 16384 Apr 27 07:43 aria_log.00000001 +-rw-rw---- 1 mysql mysql 52 Apr 27 07:43 aria_log_control +-rw-rw---- 1 mysql mysql 18874368 Apr 27 07:43 ibdata1 +-rw-rw---- 1 mysql mysql 5242880 Apr 27 07:43 ib_logfile0 +-rw-rw---- 1 mysql mysql 5242880 Apr 27 07:43 ib_logfile1 +-rw-rw---- 1 mysql mysql 264 Apr 27 07:43 mysql-bin.000001 +-rw-rw---- 1 mysql mysql 19 Apr 27 07:43 mysql-bin.index +-rw-r----- 1 mysql mysql 2166 Apr 27 07:43 node1.anyisalin.com.err + + +[root@node1 data]# service mysqld restart +MySQL server PID file could not be found! [FAILED] +Starting MySQL.. [ OK ] + +MariaDB [(none)]> SHOW DATABASES; #查看数据库, 已经恢复 ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| employees | +| mysql | +| performance_schema | +| test | ++--------------------+ +5 rows in set (0.00 sec +``` + +**增量备份** + +```sql +#########创建连两个数据库以供测试##################### +MariaDB [(none)]> CREATE DATABASE TEST1; +Query OK, 1 row affected (0.00 sec) + +MariaDB [(none)]> CREATE DATABASE TEST2; +Query OK, 1 row affected (0.00 sec) + +[root@node1 ~]# innobackupex --incremental /extrabackup/ --incremental-basedir=/extrabackup/2016-04-27_07-30-48/ + +[root@node1 ~]# ls /extrabackup/2016-04-27_07-57-22/ #查看备份文件 +total 96 +-rw-r----- 1 root root 386 Apr 27 07:57 backup-my.cnf +drwx------ 2 root root 4096 Apr 27 07:57 employees +-rw-r----- 1 root root 49152 Apr 27 07:57 ibdata1.delta +-rw-r----- 1 root root 44 Apr 27 07:57 ibdata1.meta +drwx------ 2 root root 4096 Apr 27 07:57 mysql +drwx------ 2 root root 4096 Apr 27 07:57 performance_schema +drwx------ 2 root root 4096 Apr 27 07:57 test +drwx------ 2 root root 4096 Apr 27 07:57 TEST1 +drwx------ 2 root root 4096 Apr 27 07:57 TEST2 +-rw-r----- 1 root root 21 Apr 27 07:57 xtrabackup_binlog_info +-rw-r----- 1 root root 123 Apr 27 07:57 xtrabackup_checkpoints +-rw-r----- 1 root root 530 Apr 27 07:57 xtrabackup_info +-rw-r----- 1 root root 2560 Apr 27 07:57 xtrabackup_logfile +``` + +> BASEDIR指的是完全备份所在的目录,此命令执行结束后,`innobackupex`命令会在`/extrabackup`目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其`--incremental-basedir`应该指向上一次的增量备份所在的目录。 +> +> 需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。 + +**整理增量备份** + +```cpp +[root@node1 ~]# innobackupex --apply-log --redo-only /extrabackup/2016-04-27_07-30-48/ +[root@node1 ~]# innobackupex --apply-log --redo-only /extrabackup/2016-04-27_07-30-48/ --incremental-dir=/extrabackup/2016-04-27_07-5 +7-22/ +``` + +**恢复数据** + +```haskell +[root@node1 ~]# rm -rf /data/* #删除数据 + +[root@node1 ~]# innobackupex --copy-back /extrabackup/2016-04-27_07-30-48/ #整理增量备份之后可以直接通过全量备份还原 + +[root@node1 ~]# chown -R mysql.mysql /data/ +[root@node1 ~]# ls /data/ -l +total 28732 +-rw-rw---- 1 mysql mysql 8192 Apr 27 08:05 aria_log.00000001 +-rw-rw---- 1 mysql mysql 52 Apr 27 08:05 aria_log_control +drwx------ 2 mysql mysql 4096 Apr 27 08:05 employees +-rw-r----- 1 mysql mysql 18874368 Apr 27 08:05 ibdata1 +-rw-r----- 1 mysql mysql 5242880 Apr 27 08:05 ib_logfile0 +-rw-r----- 1 mysql mysql 5242880 Apr 27 08:05 ib_logfile1 +drwx------ 2 mysql mysql 4096 Apr 27 08:05 mysql +-rw-rw---- 1 mysql mysql 245 Apr 27 08:05 mysql-bin.000001 +-rw-rw---- 1 mysql mysql 19 Apr 27 08:05 mysql-bin.index +-rw-r----- 1 mysql mysql 1812 Apr 27 08:05 node1.anyisalin.com.err +-rw-rw---- 1 mysql mysql 5 Apr 27 08:05 node1.anyisalin.com.pid +drwx------ 2 mysql mysql 4096 Apr 27 08:05 performance_schema +drwx------ 2 mysql mysql 4096 Apr 27 08:05 test +drwx------ 2 mysql mysql 4096 Apr 27 08:05 TEST1 +drwx------ 2 mysql mysql 4096 Apr 27 08:05 TEST2 +-rw-r----- 1 mysql mysql 29 Apr 27 08:05 xtrabackup_binlog_pos_innodb +-rw-r----- 1 mysql mysql 530 Apr 27 08:05 xtrabackup_info + +MariaDB [(none)]> SHOW DATABASES; #数据还原 ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| TEST1 | +| TEST2 | +| employees | +| mysql | +| performance_schema | +| test | ++--------------------+ +7 rows in set (0.00 sec) + +#关于xtrabackup还有很多强大的功能没有叙述、有兴趣可以去看官方文档 +``` + +## 总结 + +| 备份方法 | 备份速度 | 恢复速度 | 便捷性 | 功能 | 一般用于 | +| ---------- | -------- | -------- | -------------------------------- | ---- | ------------------ | +| cp | 快 | 快 | 一般、灵活性低 | 很弱 | 少量数据备份 | +| mysqldump | 慢 | 慢 | 一般、可无视存储引擎的差异 | 一般 | 中小型数据量的备份 | +| lvm2快照 | 快 | 快 | 一般、支持几乎热备、速度快 | 一般 | 中小型数据量的备份 | +| xtrabackup | 较快 | 较快 | 实现innodb热备、对存储引擎有要求 | 强大 | 较大规模的备份 | + +其实我们还可以通过`Master-Slave Replication` 进行备份。 + +## 运行sql文件 + +在mysql + +```sql +source sql文件路径 +# 可以将文件上传到服务器也可以在本机 +``` + +在服务器 + +```sql +mysql -u root -p 数据库名 < sql文件路径 +``` + +## 插入10000条数据 + +```sql +use linux; +# 建立一个数据表 zen(id,name,phone,hobby) +use linux; +delimiter // +create procedure pro_v() +begin + declare i int default 1; + start transaction; + while i<=10000000 do + insert into zen values(null,(select concat + (mid('文徐李悠金郑钱黄肖罗将刘钟朴沈梁西林纱名平周方韩张章',floor(rand()*26+1),1), + substr('龙铉维知志多礼夏井子元采一泰太辰成在廷昇祯精彩宥',floor(rand()*24+1),1), + substr('馥辰志浩娜桃南一容祐英月喻元寅玟源叶演领',floor(rand()*20+1),1))), + (select 100+i), + (select mid('男女',floor(rand()*2+1),1)), + (select '爱好')); + set i=i+1; + end while; + commit; +end // + +call pro_v(); +``` + diff --git "a/\350\265\226\345\277\203\345\246\215/assets/20.png" "b/\350\265\226\345\277\203\345\246\215/assets/20.png" new file mode 100644 index 0000000000000000000000000000000000000000..88099733cc922cea99e07deb6c2f90ef495b4d45 Binary files /dev/null and "b/\350\265\226\345\277\203\345\246\215/assets/20.png" differ diff --git "a/\350\265\226\345\277\203\345\246\215/assets/21.png" "b/\350\265\226\345\277\203\345\246\215/assets/21.png" new file mode 100644 index 0000000000000000000000000000000000000000..29a4db6432611f932527a0b89b4224f97423228f Binary files /dev/null and "b/\350\265\226\345\277\203\345\246\215/assets/21.png" differ diff --git "a/\350\265\226\345\277\203\345\246\215/assets/22.png" "b/\350\265\226\345\277\203\345\246\215/assets/22.png" new file mode 100644 index 0000000000000000000000000000000000000000..5dcc572c906199ad623a8c0e9644cedb46eeafe6 Binary files /dev/null and "b/\350\265\226\345\277\203\345\246\215/assets/22.png" differ diff --git "a/\350\265\226\345\277\203\345\246\215/assets/23.png" "b/\350\265\226\345\277\203\345\246\215/assets/23.png" new file mode 100644 index 0000000000000000000000000000000000000000..3c6c5a0ea02657c2918d477285443aa7c2a3f90c Binary files /dev/null and "b/\350\265\226\345\277\203\345\246\215/assets/23.png" differ diff --git "a/\350\265\226\345\277\203\345\246\215/assets/24.PNG" "b/\350\265\226\345\277\203\345\246\215/assets/24.PNG" new file mode 100644 index 0000000000000000000000000000000000000000..bf6560bc042abba8492c5eaafb6deef15069cd86 Binary files /dev/null and "b/\350\265\226\345\277\203\345\246\215/assets/24.PNG" differ diff --git "a/\350\265\226\345\277\203\345\246\215/assets/25.PNG" "b/\350\265\226\345\277\203\345\246\215/assets/25.PNG" new file mode 100644 index 0000000000000000000000000000000000000000..791c4a4e1cda71efdb53f31f133681e7e60f1c4b Binary files /dev/null and "b/\350\265\226\345\277\203\345\246\215/assets/25.PNG" differ diff --git "a/\350\265\226\345\277\203\345\246\215/assets/26.PNG" "b/\350\265\226\345\277\203\345\246\215/assets/26.PNG" new file mode 100644 index 0000000000000000000000000000000000000000..f0b8cf0aada55c312da3c145d86f1c5f6ec58fb4 Binary files /dev/null and "b/\350\265\226\345\277\203\345\246\215/assets/26.PNG" differ diff --git "a/\350\265\226\345\277\203\345\246\215/assets/27.PNG" "b/\350\265\226\345\277\203\345\246\215/assets/27.PNG" new file mode 100644 index 0000000000000000000000000000000000000000..51b6fc6963661091d6de9a16e819e978837badca Binary files /dev/null and "b/\350\265\226\345\277\203\345\246\215/assets/27.PNG" differ diff --git "a/\350\265\226\345\277\203\345\246\215/assets/28.PNG" "b/\350\265\226\345\277\203\345\246\215/assets/28.PNG" new file mode 100644 index 0000000000000000000000000000000000000000..27f7f4fbedb27cd3407a2ccecbdfa55b8849415e Binary files /dev/null and "b/\350\265\226\345\277\203\345\246\215/assets/28.PNG" differ diff --git "a/\350\265\226\345\277\203\345\246\215/assets/29.png" "b/\350\265\226\345\277\203\345\246\215/assets/29.png" new file mode 100644 index 0000000000000000000000000000000000000000..04612e883b98c0d23e7c5c34c64a22033d7969fa Binary files /dev/null and "b/\350\265\226\345\277\203\345\246\215/assets/29.png" differ diff --git "a/\350\265\226\345\277\203\345\246\215/assets/30.png" "b/\350\265\226\345\277\203\345\246\215/assets/30.png" new file mode 100644 index 0000000000000000000000000000000000000000..aa43bf7dfecdbcb15e3071127e75359b96f65034 Binary files /dev/null and "b/\350\265\226\345\277\203\345\246\215/assets/30.png" differ diff --git "a/\350\265\226\345\277\203\345\246\215/assets/31.png" "b/\350\265\226\345\277\203\345\246\215/assets/31.png" new file mode 100644 index 0000000000000000000000000000000000000000..d27c97cc32a2aebc0689559d8fc8ff55df14986c Binary files /dev/null and "b/\350\265\226\345\277\203\345\246\215/assets/31.png" differ diff --git "a/\350\265\226\345\277\203\345\246\215/assets/32.png" "b/\350\265\226\345\277\203\345\246\215/assets/32.png" new file mode 100644 index 0000000000000000000000000000000000000000..70d7893019e9ced012de542991713acb340c4156 Binary files /dev/null and "b/\350\265\226\345\277\203\345\246\215/assets/32.png" differ diff --git "a/\350\265\226\345\277\203\345\246\215/assets/33.png" "b/\350\265\226\345\277\203\345\246\215/assets/33.png" new file mode 100644 index 0000000000000000000000000000000000000000..f3448af1fef16692de7b18314c425d742c57a57d Binary files /dev/null and "b/\350\265\226\345\277\203\345\246\215/assets/33.png" differ diff --git "a/\350\265\226\345\277\203\345\246\215/assets/34.png" "b/\350\265\226\345\277\203\345\246\215/assets/34.png" new file mode 100644 index 0000000000000000000000000000000000000000..9cb382f8a516ef351491460c6547611775064806 Binary files /dev/null and "b/\350\265\226\345\277\203\345\246\215/assets/34.png" differ diff --git "a/\350\265\226\345\277\203\345\246\215/assets/35.png" "b/\350\265\226\345\277\203\345\246\215/assets/35.png" new file mode 100644 index 0000000000000000000000000000000000000000..9e848ea63a477ab909c34840a164b874c29837d4 Binary files /dev/null and "b/\350\265\226\345\277\203\345\246\215/assets/35.png" differ diff --git "a/\350\265\226\345\277\203\345\246\215/assets/36.png" "b/\350\265\226\345\277\203\345\246\215/assets/36.png" new file mode 100644 index 0000000000000000000000000000000000000000..191a35d86f4e9751073cd004b51af208438bb034 Binary files /dev/null and "b/\350\265\226\345\277\203\345\246\215/assets/36.png" differ