目次
1.データバックアップの概要
1.1データバックアップの重要性
- 本番環境では、データのセキュリティが重要です
- データの損失は検証の結果をもたらす可能性があります
- データ損失の原因:
プログラムエラー、操作エラー(主に)、操作エラー、ディスク障害、災害(地震や火事など)、盗難
1.2データベースのバックアップの分類
- 物理的および論理的な観点から、それは次のように分類できます。
物理バックアップ:データベースオペレーティングシステムの物理ファイル(データファイル、ログファイルなど)の
バックアップ論理バックアップ:データベースの論理コンポーネント(テーブルやその他のデータベースオブジェクトなど)のバックアップ - 物理バックアップ方法:
コールドバックアップ(オフラインバックアップ):データベースが閉じているときに実行されます。
ホットバックアップ(オンラインバックアップ):データベースは実行中で、データベースログファイルに依存します。
ウォームバックアップ:データベースロックテーブル(書き込み不可ですが、読み取り可能)バックアップ操作のステータス
1.3一般的に使用されるバックアップ方法
- 物理バックアップ
データベースはバックアップ中に閉じられ、データベースファイルは直接パッケージ化されます。
バックアップ速度が速く、リカバリが最も簡単です。 - 専用のバックアップツールmydumpまたはmysqlhotcopy
mysqldump一般的に使用される論理バックアップツール
mysqlhotcopyには、バックアップMyISAMおよびARCHIVEテーブルのみがあります。 - 増分バックアップのバイナリログを有効にする増分バックアップを
実行するには、バイナリログを更新する必要があります - サードパーティツール
無料のMysqlホットバックアップソフトウェアPercona XtraBackup
1.4 MySQLの完全バックアップ
- データベース全体、データベース構造、ファイル構造のバックアップです。
- バックアップが完了したらデータベースを保存します
- 差分バックアップと増分バックアップの基礎です
- 利点:シンプルで便利なバックアップおよびリカバリー操作
- 短所:データの重複が
多く、バックアップスペースを大量に消費し、
バックアップとリカバリに時間がかかる
1.4.1データベースの完全バックアップの分類
- 物理コールドバックアップとリカバリ
Mysqlデータベース
を閉じるtarコマンドを使用して、データベースフォルダーを直接パッケージ化し
、既存のMysqlディレクトリを直接置き換えます - mysqldumpのバックアップと復元
MySQLには、MySQLのバックアップを容易にするバックアップツールが付属しています。
指定したライブラリとテーブルをSQLスクリプトとしてエクスポートできます
。mysqlコマンドを使用して、バックアップデータをインポートします。
2、MySQLの物理的なコールドバックアップとリカバリ
- バックアップ
[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# tar zcf /opt/mysql_all-$(date +%F).tar.gz /usr/local/mysql/data/
- 削減
[root@localhost mnt]# mkdir /bak/
[root@localhost mnt]# mv /usr/local/mysql/data/ /mnt/bak/ ## 将出现问题的数据移/mnt/bak里面
[root@localhost opt]# tar zxf /opt/mysql_all-2020-08-23.tar.gz -C /mnt/ ## 解压备份的文件到mnt下
[root@localhost mnt]# mv usr/local/mysql/data/ /usr/local/mysql/ ## 将备份文件移动至库文件夹下
[root@localhost ~]# systemctl start mysqld ## 重新启动服务
3、mysqldumpバックアップデータベース
- mysqldumpコマンドは、単一のライブラリの完全バックアップを作成します
- 基本フォーマット
mysqldump -u 用户名 -p [密码][选项][数据库] > /备份路径/备份文件名
例:
[root@localhost mysql]# mysqldump -uroot -p students > /opt/students.sql
Enter password:
- データベースの完全バックアップ
mysqldump -u 用户名 -p [密码][选项] --all-databases > /备份路径/备份文件名
例:
[root@localhost mysql]# mysqldump -uroot -p --all-databases > /opt/all_data.sql
- ライブラリ内の特定のテーブルをバックアップする
mysqldump -u 用户名 -p [密码][选项] 数据库名 表名 > /备份路径/备份文件名
例:
[root@localhost mysql]# mysqldump -uroot -p students test > /opt/students-test.sql
4番目に、データベースまたはテーブルを復元します
4.1データベースを復元する
-
mysqldumpを使用してスクリプトをエクスポートします。importmethod
sourceコマンドmysqlコマンドを使用できます -
ソースを使用してデータベースを復元する手順
-
MySQLデータベースにログインします。
-
ソースバックアップSQLスクリプトを実行するパス
-
ソースリカバリの例
mysql> source /opt/students.sql
- MySQLリカバリの例
[root@localhost mysql]# mysql -uroot -pabc123 students < /opt/students.sql ## mysql单个库的还原需要指定库,
## 两个或两个以上的恢复,就不需要,因为此时本分的文件里有了创建数据库的操作,单个的话没有
4.2回復テーブル
- テーブルを復元するときに、ソースまたはmysqlコマンドを使用することもできます
- ソースリカバリテーブルの操作は、リカバリライブラリの操作と同じです。
- バックアップファイルにテーブルのバックアップのみが含まれ、ライブラリを作成するステートメントが含まれていない場合、ライブラリ名を指定し、ターゲットライブラリが存在する必要があります。
mysql -u [用户名] -p [密码] < 表备份脚本的路径
5、増分バックアップ
最後のバックアップ後に追加または変更されたファイルまたはコンテンツです(増分バックアップの基本は、最後の完全バックアップです)。
- 機能
データの重複はなく、バックアップの量は大きくなく、期間も異なります。
回復には、最後の完全バックアップと完全バックアップ後のすべての増分バックアップを復元する必要があり、すべての増分バックアップを元に戻し、1つずつ復元する必要があります。
mysqlには直接バックアップ方法はありません。mysqlによって提供されるバイナリログを介して間接的にバックアップできます。
- バックアップ用のmysqlバイナリログの重要性:
バイナリログは、データベースを更新する可能性のあるすべての更新または操作を保存します。
バイナリログは、mysqlサーバーの起動後に記録を開始し、ファイルがmax_binlog_sizeによって設定されたサイズに達するか、フラッシュログコマンドを受信すると、新しいファイルを再作成しますログファイル
のバイナリシーケンスと安全な増分バックアップにこれらのログを保存するためにタイムリーに生成された再作成し、新しいログファイルへのインプリメンテーション・フラッシュログ方式の唯一のタイミングは一定の期間を完了
5.1 MySQLデータベースの増分リカバリ
5.1.1一般的な回復
一般的な回復:すべてのバイナリログの内容を回復します
- 基本フォーマット
mysqlbinlog [--no-defaults] 增量备份文件 | mysql -u 用户名 -p
5.1.2場所に基づく回復
-
位置に基づいて回復:特定の間違った操作セグメントで回復し、間違った操作をスキップして回復します
-
指定した場所にデータを復元します(つまり、指定した場所で停止します)
mysqlbinlog [--no-defaults] --stop-position='操作 id' 二进制文件 | mysql -u 用户名 -p 密码
- 指定された場所からデータを回復する
mysqlbinlog [--no-defaults] --start-position='操作 id' 二进制文件 | mysql -u 用户名 -p 密码
5.1.3特定時点に基づく回復
ポイントインタイムリカバリ:エラー操作が発生した時点をスキップします
- ログの先頭から特定の時点までの回復
mysqlbinlog [--no-defaults] --stop-datetime='年-月-日 小时:分钟:秒' 二进制日志 | mysql -u 用户名 -p 密码``
- 特定の時点からログの最後までの回復
mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' 二进制日志 | mysql -u 用户名 -p 密码
- ある時点からある時点への回復
mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' --stop-datetime='年-月-日 小时:分钟:秒' 二进制日志 | mysql -u 用户名 -p 密码
5.1.4バイナリログファイル
- バイナリログ機能を有効にする
vim /etc/cnf
在mysqld 中加 log-bin=mysql-bin
- バイナリログファイルを表示する
mysqlbinlog --no-defaults mysql-bin.000001 ## mysql-bin.000001为日志增量名
- バイナリファイルのデコード
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000001 >/opt/bk02.txt
- 新しいバイナリログファイルを生成する操作が完了しました
mysqladmin -uroot -p flush-logs ## 刷新日志,生成新的存储日志的文件,备份增量日志
5.2ファイルの増分リカバリ
5.2.1バイナリログ機能を有効にする
[root@localhost ~]# systemctl stop mysqld ## 先关闭数据库
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
省略不写……
log-bin=mysql-bin ## 在mysqld模块下添加二进制日志功能
[root@localhost ~]# ls /usr/local/mysql/data/ ## mysql-bin.000001 发现二进制日志文件
auto.cnf ibdata1 ib_logfile1 mysql mysql-bin.index students
ib_buffer_pool ib_logfile0 ibtmp1 mysql-bin.000001 performance_schema sys
5.2.2オペレーション
[root@localhost ~]# mysqldump -uroot -p students > /mnt/students.sql ## 进行数据库students的备份
[root@localhost data]# mysqladmin -uroot -pabc123 flush-logs ## 生成新的增量备份文件
mysql> select * from xuesheng; ## 查看未操作的表
+----+----------+-------+----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+----------+-------+
| 1 | zhangsan | 90 | nanjing | 1 |
| 2 | lisi | 88 | chengdu | 1 |
| 3 | wangwu | 75 | shanghai | 2 |
| 4 | zhaoliu | 60 | beijing | 2 |
| 5 | tianqi | 78 | hangzhou | 1 |
| 6 | heiba | 78 | hangzhou | 1 |
| 7 | heiba1 | 78 | hangzhou | 1 |
| 8 | heiba2 | 78 | hangzhou | 1 |
+----+----------+-------+----------+-------+
8 rows in set (0.00 sec)
mysql> insert into xuesheng(name,score,address,hobby) values('tom',85,'guangzhou',1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into xuesheng(name,score,address,hobby) values('jerry',62,'chongqing',2);
Query OK, 1 row affected (0.01 sec)
mysql> delete from xuesheng where id=2; ## 模拟误操作
Query OK, 1 row affected (0.00 sec)
mysql> insert into xuesheng(name,score,address,hobby) values('lilei',73,'wuhan',1);
Query OK, 1 row affected (0.00 sec)
mysql> select * from xuesheng;
+----+----------+-------+-----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+-----------+-------+
| 1 | zhangsan | 90 | nanjing | 1 |
| 3 | wangwu | 75 | shanghai | 2 |
| 4 | zhaoliu | 60 | beijing | 2 |
| 5 | tianqi | 78 | hangzhou | 1 |
| 6 | heiba | 78 | hangzhou | 1 |
| 7 | heiba1 | 78 | hangzhou | 1 |
| 8 | heiba2 | 78 | hangzhou | 1 |
| 9 | tom | 85 | guangzhou | 1 |
| 10 | jerry | 62 | chongqing | 2 |
| 11 | lilei | 73 | wuhan | 1 |
+----+----------+-------+-----------+-------+
10 rows in set (0.00 sec)
5.2.3バイナリファイルのデコード
[root@localhost data]# mysqladmin -uroot -pabc123 flush-logs ## 保存刚刚的增量备份二进制文件,生成新的备份文件
乱码看不懂 需解码
64位解码 -v 显示更详细信息
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002 >/mnt/bk02.txt
[root@localhost mnt]# vim /mnt/bk02.txt
# at 891 ## 误操作时间与位置
#200824 10:21:46 server id 1 end_log_pos 954 CRC32 0x0d15a891 Table_map: `students`.`xuesheng` mapped to number 124
# at 954
#200824 10:21:46 server id 1 end_log_pos 1015 CRC32 0xc2261844 Delete_rows: table id 124 flags: STMT_END_F
### DELETE FROM `students`.`xuesheng`
### WHERE
### @1=2
### @2='lisi'
### @3=88
### @4='chengdu'
### @5=1
# at 1187 ## 紧接着插入lilei的时间与位置
#200824 10:22:23 server id 1 end_log_pos 1250 CRC32 0xfa311240 Table_map: `students`.`xuesheng` mapped to number 124
# at 1250
#200824 10:22:23 server id 1 end_log_pos 1310 CRC32 0x9bce74dd Write_rows: table id 124 flags: STMT_END_F
### INSERT INTO `students`.`xuesheng`
### SET
### @1=11
### @2='lilei'
### @3=73
### @4='wuhan'
### @5=1
5.2.4場所に基づいてファイルを復元する
- ロケーションベースの回復
mysql> drop table xuesheng; ## 删除操作错误后存在的表
Query OK, 0 rows affected (0.01 sec)
mysql> source /mnt/students.sql ## 用完整备份的文件恢复
mysql> select * from xuesheng;
+----+----------+-------+----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+----------+-------+
| 1 | zhangsan | 90 | nanjing | 1 |
| 2 | lisi | 88 | chengdu | 1 |
| 3 | wangwu | 75 | shanghai | 2 |
| 4 | zhaoliu | 60 | beijing | 2 |
| 5 | tianqi | 78 | hangzhou | 1 |
| 6 | heiba | 78 | hangzhou | 1 |
| 7 | heiba1 | 78 | hangzhou | 1 |
| 8 | heiba2 | 78 | hangzhou | 1 |
+----+----------+-------+----------+-------+
8 rows in set (0.00 sec)
[root@localhost data]# mysqlbinlog --no-defaults --stop-position='891' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p
mysql> select * from xuesheng; ## 此时已经恢复了tom 和jerry
+----+----------+-------+-----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+-----------+-------+
| 1 | zhangsan | 90 | nanjing | 1 |
| 2 | lisi | 88 | chengdu | 1 |
| 3 | wangwu | 75 | shanghai | 2 |
| 4 | zhaoliu | 60 | beijing | 2 |
| 5 | tianqi | 78 | hangzhou | 1 |
| 6 | heiba | 78 | hangzhou | 1 |
| 7 | heiba1 | 78 | hangzhou | 1 |
| 8 | heiba2 | 78 | hangzhou | 1 |
| 9 | tom | 85 | guangzhou | 1 |
| 10 | jerry | 62 | chongqing | 2 |
+----+----------+-------+-----------+-------+
[root@localhost data]# mysqlbinlog --no-defaults --start-position='1187' /usr/local/mysql/data/mysql-bin.000002 | mysql -uroot -p
mysql> select * from xuesheng; ## 恢复lilei 未删除lisi
+----+----------+-------+-----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+-----------+-------+
| 1 | zhangsan | 90 | nanjing | 1 |
| 2 | lisi | 88 | chengdu | 1 |
| 3 | wangwu | 75 | shanghai | 2 |
| 4 | zhaoliu | 60 | beijing | 2 |
| 5 | tianqi | 78 | hangzhou | 1 |
| 6 | heiba | 78 | hangzhou | 1 |
| 7 | heiba1 | 78 | hangzhou | 1 |
| 8 | heiba2 | 78 | hangzhou | 1 |
| 9 | tom | 85 | guangzhou | 1 |
| 10 | jerry | 62 | chongqing | 2 |
| 11 | lilei | 73 | wuhan | 1 |
+----+----------+-------+-----------+-------+
5.2.5特定時点に基づいてファイルを復元する
- 以前の操作は同じですが、復元コマンドが異なります
[root@localhost data]# mysqlbinlog --no-defaults --stop-datetime='2020-08-24 10:21:46' /usr/local/mysql/data/mysql-bin.000002 |mysql -uroot -p
[root@localhost data]# mysqlbinlog --no-defaults --start-datetime='2020-08-24 10:22:23' /usr/local/mysql/data/mysql-bin.000002 | mysql -uroot -p