昨天做了MySQL数据库的备份基本操作的实验,今天试一下MySQL数据库的定时自动备份。
大概思路就是,首先为备份文件单独创建一个目录,然后再目录下创建Shell脚本里写上执行数据库备份的命令,并且给这个Shell脚本添加可执行的权限,最后给这个Shell脚本添加到crond计划任务,让它每天定时执行。
1、首先进入home目录,创建一个mysqlBackup的目录,然后进入这个目录
2、创建一个.sh后缀的文件,
3、编辑Shell脚本,备份所有数据库到/home/mysqlBackup目录下,并命名为Back_年月日_时分秒.sql
4、为备份文件添加X执行操作,并且我取消了同组、其他用户的读权限,因为脚本里面有数据库密码=..=
5、执行一下康康
成功了
6、下面删俩库,拿这个恢复备份测试一下
当前状态:
把两测试用的库删了
恢复备份
但是这里报错了,我又试了一下手工备份,发现是可以恢复的
这个问题花了我半天时间,最后发现原因是出在了脚本上,脚本里面的sql语句是将密码直接写在了参数-p 后面,而之前的操作都是-p后面没有输入密码通过后面密码出入窗输入的。
下面对比一下不直接输入密码和直接输入密码生成的两个文件a.sql和b.sql
下面图片可以明显看出来a.sql文件文件大小为849000+,而b.sql只有203
所以想要用.sh完成备份数据库就需要解决脚本与服务器输入数据库密码这个交互的过程,我觉得用expect这个工具应该也是可以实现的,但我搜了一波别人是怎解决的发现,发现好像别人的脚本里都是将一些数据库的信息赋值给了变量,然后调用变量来备份的,然后我修改了一下Shell脚本。
这次执行也报错了
原因是因为在MySQL5.6之后版本的数据库的安全机制,大概意思就是在命令行使用密码可能不安全,所以这个也是用不了的。
解决这个问题需要修改数据库的my.cnf配置文件
这样备份数据库可以使用:
mysqldump --defaults-extra-file = /etc/my.cnf --all-databases> bak.sql
バックアップの復元も使用できます。
mysql --defaults-extra-file = /etc/my.cnf <bak.sql;
実際には、パスワードを復元しても大丈夫です
次に、別の.shスクリプトを編集します
実行する権限を追加
テストでは、データベースを追加するために、復元することはできません
バックアップを作成
テストデータベースを削除する
パスワードを入力せずにバックアップを復元してみてください
削除されたデータベースが復元されました
7.スケジュールされたタスクにシェルスクリプトを追加する
最初にcrondの状態を見て、それが開いていることを確認します
次に、/ etc / crontabファイルを編集して、シェルスクリプトを構成ファイルに追加します。
このルールは比較的簡単です
* * * * *ユーザースクリプト
* 1時間の最初の数分を示します。0〜59を入力できます
*時間を示します。0〜23を入力できます
*月の日を示します。1〜31を入力できます
*年の最初の数か月を示し、1〜12を入力できます
*曜日を示します。日曜日には0-6、0または7を入力できます
0 2 * * *ユーザースクリプト//毎日2時に実行すると述べた
0 2 * * 7ユーザースクリプト//毎週日曜日の2時に実行すると述べた
0 2 10,20,30 * *ユーザースクリプト//は、毎月10、20、30日に実行されることを意味します
* / 1 * * * *ユーザースクリプト//毎分実行
0 * * * *ユーザースクリプト//は、その日の毎時間実行することを意味します
次に、曜日は月と日にあまり気分が悪いので、必要なものを見てみましょう
以下で試して、最初にバックアップを削除してから、設定されているときにバックアップスクリプトを実行してみてください。
今は38です。40を設定して、
ねえ、うまくいった
まとめると
1.データベース構成ファイルmy.cnfにパスワードを書き込みます(他にもっと良い方法があるかもしれません)
2.シェルスクリプトを使用してバックアップステートメントを記述し、このシェルスクリプトに実行権限を付与する
3. crondを介してタスクをスケジュールし、定期的にシェルスクリプトを実行する
しかし、これはデータのプライバシーそれと矛盾することはないでしょうか?