mysql自動備份腳本
mysqlmp備份還原和mysqlmp導入導出語句大全詳解
mysqlmp備份:
mysqlmp -u用戶名 -p密碼 -h主機資料庫 a -w "sql條件" --lock-all-tables >路徑
案例:
mysqlmp -uroot -p1234 -hlocalhost db1 a -w "id in (select id from b)" --lock-all-tables > c:\aa.txt
mysqlmp還原:
mysqlmp -u用戶名 -p密碼 -h主機資料庫<路徑
案例:
mysql -uroot -p1234 db1 < c:\aa.txt
mysqlmp按條件導出:
mysqlmp -u用戶名 -p密碼 -h主機資料庫 a --where "條件語句" --no-建表>路徑
mysqlmp -uroot -p1234 dbname a --where "tag='88'" --no-create-info> c:\a.sql
mysqlmp按導入:
mysqlmp -u用戶名 -p密碼 -h主機資料庫<路徑
案例:
mysql -uroot -p1234 db1 < c:\a.txt
mysqlmp導出表:
mysqlmp -u用戶名 -p密碼 -h主機資料庫表
案例:
mysqlmp -uroot -p sqlhk9 a --no-data
講一下 mysqlmp 的一些主要參數
--compatible=name
它告訴 mysqlmp,導出的數據將和哪種資料庫或哪個舊版本的 MySQL 伺服器相兼容。值可以為 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等,要使用幾個值,用逗號將它們隔開。當然了,它並不保證能完全兼容,而是盡量兼容。
--complete-insert,-c
導出的數據採用包含欄位名的完整 INSERT 方式,也就是把所有的值都寫在一行。這么做能提高插入效率,但是可能會受到 max_allowed_packet 參數的影響而導致插入失敗。因此,需要謹慎使用該參數,至少我不推薦。
--default-character-set=charset
指定導出數據時採用何種字元集,如果數據表不是採用默認的 latin1 字元集的話,那麼導出時必須指定該選項,否則再次導入數據後將產生亂碼問題。
--disable-keys
告訴 mysqlmp 在 INSERT 語句的開頭和結尾增加 /*!40000 ALTER TABLE table DISABLE KEYS */; 和 /*!40000 ALTER TABLE table ENABLE KEYS */; 語句,這能大大提高插入語句的速度,因為它是在插入完所有數據後才重建索引的。該選項只適合 MyISAM 表。
--extended-insert = true|false
默認情況下,mysqlmp 開啟 --complete-insert 模式,因此不想用它的的話,就使用本選項,設定它的值為 false 即可。
--hex-blob
使用十六進制格式導出二進制字元串欄位。如果有二進制數據就必須使用本選項。影響到的欄位類型有 BINARY、VARBINARY、BLOB。
--lock-all-tables,-x
在開始導出之前,提交請求鎖定所有資料庫中的所有表,以保證數據的一致性。這是一個全局讀鎖,並且自動關閉 --single-transaction 和 --lock-tables 選項。
--lock-tables
它和 --lock-all-tables 類似,不過是鎖定當前導出的數據表,而不是一下子鎖定全部庫下的表。本選項只適用於 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 選項。
--no-create-info,-t
只導出數據,而不添加 CREATE TABLE 語句。
--no-data,-d
不導出任何數據,只導出資料庫表結構。
--opt
這只是一個快捷選項,等同於同時添加 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 選項。本選項能讓 mysqlmp 很快的導出數據,並且導出的數據能很快導回。該選項默認開啟,但可以用 --skip-opt 禁用。注意,如果運行 mysqlmp 沒有指定 --quick 或 --opt 選項,則會將整個結果集放在內存中。如果導出大資料庫的話可能會出現問題。
--quick,-q
該選項在導出大表時很有用,它強制 mysqlmp 從伺服器查詢取得記錄直接輸出而不是取得所有記錄後將它們緩存到內存中。
--routines,-R
導出存儲過程以及自定義函數。
--single-transaction
該選項在導出數據之前提交一個 BEGIN SQL語句,BEGIN 不會阻塞任何應用程序且能保證導出時資料庫的一致性狀態。它只適用於事務表,例如 InnoDB 和 BDB。
本選項和 --lock-tables 選項是互斥的,因為 LOCK TABLES 會使任何掛起的事務隱含提交。
要想導出大表的話,應結合使用 --quick 選項。
--triggers
同時導出觸發器。該選項默認啟用,用 --skip-triggers 禁用它。
其他參數詳情請參考手冊,我通常使用以下 SQL 來備份 MyISAM 表:
/usr/local/mysql/bin/mysqlmp -uyejr -pyejr "
--default-character-set=utf8 --opt --extended-insert=false "
--triggers -R --hex-blob -x db_name > db_name.sql
使用以下 SQL 來備份 Innodb 表:
/usr/local/mysql/bin/mysqlmp -uyejr -pyejr "
--default-character-set=utf8 --opt --extended-insert=false "
--triggers -R --hex-blob --single-transaction db_name > db_name.sql
另外,如果想要實現在線備份,還可以使用 --master-data 參數來實現,如下:
/usr/local/mysql/bin/mysqlmp -uyejr -pyejr "
--default-character-set=utf8 --opt --master-data=1 "
--single-transaction --flush-logs db_name > db_name.sql
它只是在一開始的瞬間請求鎖表,然後就刷新binlog了,而後在導出的文件中加入CHANGE MASTER 語句來指定當前備份的binlog位置,如果要把這個文件恢復到slave里去,就可以採用這種方法來做。
1.2 還原
用 mysqlmp 備份出來的文件是一個可以直接倒入的 SQL 腳本,有兩種方法可以將數據導入。
直接用 mysql 客戶端
例如:
/usr/local/mysql/bin/mysql -uyejr -pyejr db_name < db_name.sql
用 SOURCE 語法(實驗不成功!!!)
其實這不是標準的 SQL 語法,而是 mysql 客戶端提供的功能,例如:
SOURCE /tmp/db_name.sql;
這里需要指定文件的絕對路徑,並且必須是 mysqld 運行用戶(例如 nobody)有許可權讀取的文件。
Ⅱ mysql中備份資料庫的命令是什麼
常規的mysql備份使用命令是 mysqlmp命令用法如下,
mysqlmp [選項] 資料庫名 [表名] > 腳本名
或mysqlmp [選項] --資料庫名 [選項 表名] > 腳本名
或mysqlmp [選項] --all-databases [選項] > 腳本名
例如:
備份所有資料庫:
mysqlmp -uroot -p --all-databases > /backup/mysqlmp/all.db
備份指定資料庫:
mysqlmp -uroot -p test > /backup/mysqlmp/test.db
備份指定資料庫指定表(多個表以空格間隔)
mysqlmp -uroot -p mysql db event > /backup/mysqlmp/2table.db
備份指定資料庫排除某些表
mysqlmp -uroot -p test --ignore-table=test.t1 --ignore-table=test.t2 > /backup/mysqlmp/test2.db
還原命令例如:
mysqladmin -uroot -p create db_name
mysql -uroot -p db_name < /backup/mysqlmp/db_name.db
註:在導入備份資料庫前,db_name如果沒有,是需要創建的; 而且與db_name.db中資料庫名是一樣的才可以導入。
Ⅲ 如何使用shell腳本每天自動備份mysql資料庫
mysql備份用自帶的備份工具mysqlmp
每天自動執行用cron工具,把mysql的備份命令放在.sh文件裡面
.sh文件放在/etc/cron.daily目錄,就會每天自動執行了。
Ⅳ 怎麼備份mysql資料庫
如果使用腳本備份的話 可以參考如下
准備
mkdir-p/data0/backup
cat>/tmp/myuse.txt<<EOF
[cleint]
user=root
password="Oracle#2017"
EOF
腳本內容:
mysql_backup_tleish.sh
#!/bin/bash
#==============================================================================
#TITLE:mysql_backup_tleish.sh
#DESCRIPTION:
#AUTHOR:tleish
#DATE:2013-12-20changeat20180116byhilodb
#VERSION:0.4
#USAGE:./mysql_backup_tleish.sh
#CRON:
#examplecronfordailydbbackup@9:15am
#minhrmdaymonthwdaycommand
#159***/Users/[yourusername]/scripts/mysql_backup_tleish.sh
#RESTOREFROMBACKUP
#$gunzip<[backupfile.sql.gz]|mysql-u[uname]-p[pass][dbname]
#==============================================================================
#CUSTOMSETTINGS
#==============================================================================
#directorytoputthebackupfiles
BACKUP_DIR=/data0/backup
#MYSQLParameters
OPTS="--all-databases--triggers--routines--events"
#Don'
#Example:startswithmysql(^mysql)orendswith_schema(_schema$)
##在這里添加忽略備份的庫
IGNORE_DB="(^mysql|_schema$)"
##如果保持IGNORE_DB為空就是備份所有資料庫
#IGNORE_DB=""
#
PATH=$PATH:/usr/local/mysql/bin
#Numberofdaystokeepbackups
KEEP_BACKUPS_FOR=30#days
#==============================================================================
#METHODS
#==============================================================================
#YYYY-MM-DD
TIMESTAMP=$(date+%F)
functioncheckok()
{
if[$?-ne0];then
echo"backupdatabase$1failed,pleasecheckscript"
exit
fi
}
functioncheck_dir()
{
[!-d$BACKUP_DIR]&&mkdir-p$BACKUP_DIR
}
functiondelete_old_backups()
{
echo"Deleting$BACKUP_DIR/*.sql.gzolderthan$KEEP_BACKUPS_FORdays"
find$BACKUP_DIR-typef-name"*.sql.gz"-mtime+$KEEP_BACKUPS_FOR-execrm{};
}
functionmysql_login(){
localmysql_login="--defaults-extra-file=/tmp/myuse.txt"
echo$mysql_login
}
functiondatabase_list(){
if["x$IGNORE_DB"=="x"];then
localshow_databases_sql="SHOWDATABASES"
else
localshow_databases_sql="SHOWDATABASESWHERE`Database`NOTREGEXP'$IGNORE_DB'"
fi
echo$(mysql$(mysql_login)-e"$show_databases_sql"|awk-F""'{if(NR!=1)print$1}')
}
functionecho_status(){
printf' ';
printf'%0.s'{0..100}
printf' ';
printf"$1"' '
}
functionbackup_database(){
backup_file="$BACKUP_DIR/$TIMESTAMP.$database.sql.gz"
output+="$database=>$backup_file "
echo_status"...backingup$countof$totaldatabases:$database"
$(mysqlmp$(mysql_login)$OPTS$database|gzip-9>$backup_file)
checkok$database
}
functionbackup_databases(){
localdatabases=$(database_list)
localtotal=$(echo$databases|wc-w|xargs)
localoutput=""
localcount=1
fordatabasein$databases;do
backup_database
localcount=$((count+1))
done
echo-ne$output|column-t
printf"Allbackep! "
}
functionhr(){
printf'=%.0s'{1..100}
printf" "
}
#==============================================================================
#RUNSCRIPT
#==============================================================================
check_dir
delete_old_backups
hr
backup_databases
hr
運行結果如下
chmod+xmysql_backup_tleish.sh
bashmysql_backup_tleish.sh
[root@ambaos1mysqlscript]#ll/data0/backup/
total12
-rw-r--r--1rootroot130Jan1615:332018-01-16.demo.sql.gz
-rw-r--r--1rootroot130Jan1615:332018-01-16.sys.sql.gz
-rw-r--r--1rootroot130Jan1615:332018-01-16.test.sql.gz
[root@ambaos1data0]#tree-L2
.
├──backup--忽略mysql和_schema的
│├──2018-01-16.demo.sql.gz
│├──2018-01-16.sys.sql.gz
│└──2018-01-16.test.sql.gz
└──backup_old---全備的
├──2018-01-16.demo.sql.gz
├──2018-01-16.information_schema.sql.gz
├──2018-01-16.mysql.sql.gz
├──2018-01-16.performance_schema.sql.gz
├──2018-01-16.sys.sql.gz
└──2018-01-16.test.sql.gz
Ⅳ 大家php mysql多的話是用什麼備份工具的
下面提供兩種方法,僅供研究使用。
第1種方法:
復制代碼 代碼如下:
<?php
$host="localhost";
$user="root";
$password="";
$dbname="dbname";
mysql_connect($host,$user,$password);
mysql_select_db($dbname);
$mysql= "set names utf8;";
mysql_query($mysql);
$q1=mysql_query("show tables");
while($t=mysql_fetch_array($q1)){
$table=$t[0];
$q2=mysql_query("show create table `$table`");$sql=mysql_fetch_array($q2);
$mysql.=$sql['Create Table'].";\n";
$q3=mysql_query("select * from `$table`");while($data=mysql_fetch_assoc($q3)){
$keys=array_keys($data);
$keys=array_map('addslashes',$keys);
$keys=join('`,`',$keys);
$keys="`".$keys."`";
$vals=array_values($data);
$vals=array_map('addslashes',$vals);
$vals=join("','",$vals);
$vals="'".$vals."'";
$mysql.="insert into `$table`($keys) values($vals);\n";}
$mysql.="\n";
}
$filename=$dbname.date('Ymj').".sql";
$fp = fopen($filename,'w');
fputs($fp,$mysql);
fclose($fp);
echo "數據備份成功,生成備份文件".$filename;?>
第2種方法:
復制代碼 代碼如下:
<?php
$host="localhost";
$user="root";
$password="";
$dbname="dbname";
backup_tables($host,$user,$password,$dbname);/* backup the db OR just a table */
function backup_tables($host,$user,$pass,$name,$tables = '*'){
$link = mysql_connect($host,$user,$pass);mysql_select_db($name,$link);
//get all of the tables
if($tables == '*')
{
$tables = array();
$result = mysql_query('SHOW TABLES');
while($row = mysql_fetch_row($result))
{
$tables[] = $row[0];
}
}
else
{
$tables = is_array($tables) ? $tables : explode(',',$tables);}
$return = '';
//cycle through
foreach($tables as $table)
{
$result = mysql_query('SELECT * FROM '.$table);$num_fields = mysql_num_fields($result);
$return.= 'DROP TABLE '.$table.';';
$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));$return.= "\n\n".$row2[1].";\n\n";
for ($i = 0; $i < $num_fields; $i++)
{
while($row = mysql_fetch_row($result))
{
$return.= 'INSERT INTO '.$table.' VALUES(';for($j=0; $j<$num_fields; $j++)
{
$row[$j] = addslashes($row[$j]);
$row[$j] = ereg_replace("\n","\\n",$row[$j]);if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
if ($j<($num_fields-1)) { $return.= ','; }
}
$return.= ");\n";
}
}
$return.="\n\n\n";
}
//save file
$handle = fopen('db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+');fwrite($handle,$return);
fclose($handle);
}
?>