- 使用mysql不熟練啊!!!
- mysqldump導出數據庫,必須以cmd命令行的形式,在Navicat中以新建查詢形式使用Mysqldump不好使的。(本來使用Navicat轉儲SQL,再導入SQL,但是報錯,半天沒解決鬧心,決定使用Mysqldump)
- Mysqldump在cmd中導出數據庫,有一點必須要注意,就是不能登錄mysql,如果使用mysql -h 47.94.88.36 -u root -p登錄了。那么再使用mysqldump -h 47.94.88.36 -u root -p dbname tablename > db.sql導出數據表結構和數據會提示你加分號,加了分號之后會報錯(我覺得和分號無關,主要是因為登錄了吧?)。意思就是不能登錄,要在未登錄的狀態下使用mysqldump -h 47.94.88.36 -u root -p dbname tablename > db.sql 命令,然后提示輸入密碼,就能夠成功導出數據了。而且在使用此命令的時候,后面不能加 ;。
- 備份
- 備份整個數據庫:
mysqldump -uroot -proot --lock-all-tables --databases emotional_course > e:/project/SQLBackUp/course.sql #emotional_course 是數據庫名 # 導出一個數據庫, 注意選項參數 --databases 這里, 不要使用--database官方不推薦使用,而且以后的版本可能會移除.(會有一個warning)
mysqldump -uroot -proot emotional_course > e:/project/SQLBackUp/course.sql #區別是上面的會鎖表(全局讀鎖),並且在SQL文件的第一行會創建數據庫, 這條語句不會再SQL文件中創建數據庫--lock-all-tables: 在mysqldump導出的整個過程中以read方式鎖住所有表, information_schema(不會導出)performance_schema(不會導出)指定--lock-all-tables參數,那么從一開始就對整個mysql實例加global read lock鎖。這整個全局讀鎖會一直持續到導出結束。導出的數據庫在數據一致性上是被嚴格保證的,也就是數據是一致性的。
在備份的時候, 備份數據會上鎖(寫鎖). - 備份某個表:
mysqldump -uroot -proot emotional_course user > e:/project/SQLBackUp/course_user.sql #備份一個表 mysqldump -uroot -proot emotional_course user course > e:/project/SQLBackUp/userandcourse.sql #備份多個表, 注意表名與表名之間是空格, 不要加標點符號(備份user表和course表)
- 備份多個數據庫:
mysqldump -uroot -proot --databases emotional_course bbb_cxk > e:/project/SQLBackUp/userandcourse.sql #需要注意的點和上面的一樣,庫名和庫名之間只有空格, 還需要注意一點, 就是第一次備份數據庫到a.sql文件,
如果第二次備份還是a.sql文件, 那么會覆蓋掉之前的備份, 需要特別注意的. - 備份全部數據庫
mysqldump -uroot -proot --all-databases > e:/project/SQLBackUp/userandcourse.sql # 輸入這個命令后會報錯,提示信息如下: -- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly. 因為mysqldump默認是不備份事件表的,只有加了--events 才會解決,加上--events --ignore-table=mysql.events參數即可. mysqldump -uroot -proot --events --ignore-table=mysql.events --all-databases > e:/project/SQLBackUp/userandcourse.sql
mysql數據庫(系統自帶的)會被備份, information_schema 和 performance_schema 兩個數據庫不會被備份.
- 編寫shell腳本執行mysql備份
#!/bin/bash number=30 #保留30天的備份文件 backup_dir=/home/bneglect/SQLBackup #保存備份文件的目錄 backup_date=`date +%Y%m%d%H%M%S` #備份時間 username=root #數據庫用戶 password=root #數據庫密碼 db_name=fortune #數據庫名 if [ ! -d $backup_dir ] then mkdir -p $backup_dir; fi # 判斷目錄是否存在, 不存在則創建 mysqldump -u$username -p$password $db_name > $backup_dir/$db_name-$backup_date.sql #備份的目錄及文件名 echo "create $backup_dir/$db_name-$backup_date.sql" >> $backup_dir/backup.log #備份的日志 count=`ls -l -crt $backup_dir/*.sql | awk '{print $9}' | wc -l` #統計目錄下的SQL文件個數 delfile=`ls -l -crt $backup_dir/*.sql | awk '{print $9}' | head -1` #第一個文件.SQL文件 if [ $count -gt $number ] then rm -f $deffile echo "delete $delfile" >> $backup_dir/backup.log fi # 刪除最早的備份文件, 一直保留30天的即可
使用-ppassword會報一個warning, 提示在命令行下輸入密碼不安全, 其實就是想要用戶Mysqldump 回車之后輸入密碼, 因為命令行下輸入密碼會暴露明文密碼的. 不過不影響備份的. 如果不想報這個warning, 可以去配置mysqld.cnf 配置文件.
- 編輯定時任務, 讓shell腳本自動執行備份數據庫.
crontab -e 編輯計划任務, 第一次會選擇文本模式, 選擇3(vim.basic)即可.30 2 * * * /home/bneglect/bneglect_test/mysqlBackUp.sh
保存退出, OK了.有的服務器直接wq就可以保存退出. 有的按照------> crontab編輯文件后保存方式 Ctrl+o, 出現"file name to write.."然后回車, 然后Ctrl+x 顯示"crontab: installing new crontab"成功(Ubuntu系統)
- 注意如果計划任務不執行, 一般從4各方面着手排查
- cron服務是否啟動(Ubuntu上是cron, 有的系統是crond) service cron status 或 systemctl status cron 查看服務狀態 service cron start 或 systemctl start cron 啟動
- shell腳本是否有語法錯誤, 可以手動執行shell腳本, 如果成功執行, 就是別的原因
- shell腳本的路徑要寫成絕對路徑,不能使用相對路徑.
- 創建計划任務的用戶沒有執行shell腳本的權限, 舉例: bneglect創建的計划任務, 但是mysqlBackUp.sh 的屬主和屬組可能是root(反正不是bneglect), 解決辦法: (1)添加bneglect到root屬組(2)修改權限為777(3)屬主改成bneglect, 不過一般都是改 777
- 備份整個數據庫: