數據備份和恢復
參考:http://www.mysqltutorial.org/mysql-copy-database/
參考:http://www.mysqltutorial.org/how-to-backup-database-using-mysqldump.aspx mysqldump命令的詳細介紹,包括參數的使用。
2020-03-08補充
導出純文本格式數據:
mysql -u root -p -e 'select * from linshi.employee' > employee.sql
另外還可以使用into outfile 命令。但需要設置一下secure_file_priv參數。
備份數據庫
mysqldump -u root -p 數據庫名 > 路徑/xxx.sql
⚠️>代表export
恢復數據庫/導入數據庫
- 連接mysql,創建新的數據庫
- 退出連接,執行如下命令: mysql -uroot -p 新數據庫名 < 路徑/xxx.sql; ⚠️< 代表import,
- 或者進入控制台,在一個數據庫內使用命令:source 路徑/xxx.sql
⚠️導入一個下載的xx.sql,到你的本地,先打開這個文件看一下,文件頭幾行代碼,比如:
CREATE DATABASE /*!32312 IF NOT EXISTS*/`classicmodels` /*!40100 DEFAULT CHARACTER SET latin1 */; USE `classicmodels`;
那么進入控制台后,使用source命令,把文件拖拉到zsh控制台,會自動得到路徑,然后敲擊回車即可。
另一種備份+恢復的方法,更高效!
使用--databases參數:
- mysqldump -u root -p --databases 數據庫名 > 路徑/xxx.sql
- 原數據庫數據丟失/損壞,刪除原數據庫。
- mysql -u root -p < 路徑/xxx.sql 或者在控制台內使用source命令。
--databases參數的作用其實是增加了2行代碼到xxx.sql中:
- create database xxx;
- use xxx;
最后查看使用:
show tables from 新的數據庫名
導入csv文件
https://dev.mysql.com/doc/refman/8.0/en/load-data.html
第一步:建表
create table orderinfo(
orderid int primary key not null ,
userid int,
isPaid varchar(10),
price float,
paidTime varchar(30));
create table userinfo(
userid int primary key,
sex varchar(10),
birth date);
第二步:導數
load data local infile '路徑/xxx.csv' into table orderinfo fields terminated by ',';
load data local infile '路徑/user_info_utf.csv' into table userinfo fields terminated by ',';
⚠️
a、語句要正確
b、路徑不要有中文,是左斜桿,
c、mysql 8.0 導入會報錯
The used command is not allowed with this MySQL version。
這是因為安全需要,對於mysql client, 默認為禁止加載本地數據。
解決辦法參考了:stackoverflow
SHOW VARIABLES LIKE 'local_infile'; SET GLOBAL local_infile = 1;
d, local關鍵字,當被指定后,會從在客戶端主機的client program讀文件並發送到server。
⚠️: 要有fields terminated by ',' 是因為csv 文件是以逗號為分割符的
第三步:對 orderinfo 表的日期數據進行規整
a、先把時間格式標准化變成 1993-02-27 。
update orderinfo set paidtime=replace(paidtime,'/','-') where paidtime is not null;
b、然后更新字符串為日期格式,然后才能使用日期函數進行操作,
update orderinfo set paidtime=str_to_date(paidtime,'%Y-%m-%d %H:%i') where paidtime is not null;
⚠️如果報 function str_to_datetime_value 錯誤,可以用 select * from orderinfo where paidtime='\r' limit 10; 來看一下是否包含了 \r 符號,
如果是包含了,則用下面語句再過濾掉
update orderinfo set paidtime=str_to_date(paidtime,'%Y-%m-%d %H:%i') where paidtime is not null and paidtime <>'\r';
❌MYSQL導入數據出現
The MySQL server is running with the --secure-file-priv option so it cannot execute this
- a.解決辦法:https://blog.csdn.net/gb4215287/article/details/79762020
- b.把數據放到secure-file-priv
附帶語句:
# 清除表全部數據命令
truncate userinfo;
相當於drop table userinfo后再create table userinfo(column...), 速度比delete from table更快。
MySQL 日期時間 Extract(選取) 函數
1. 選取日期時間的各個部分:日期、時間、年、季度、月、日、小時、分鍾、秒、微秒
set @dt = '2008-09-10 07:15:30.123456'; select date(@dt); -- 2008-09-10 select time(@dt); -- 07:15:30.123456 select year(@dt); -- 2008 select quarter(@dt); -- 3 select month(@dt); -- 9 select week(@dt); -- 36 select day(@dt); -- 10 select hour(@dt); -- 7 select minute(@dt); -- 15 select second(@dt); -- 30 select microsecond(@dt); -- 123456
2. date_add()函數
mysql> select date_add("2017-06-15",INTERVAL 10 DAY); +----------------------------------------+ | date_add("2017-06-15",INTERVAL 10 DAY) | +----------------------------------------+ | 2017-06-25 | +----------------------------------------+
\r符號,\n, 回車和換行的區別
https://www.cnblogs.com/xiaotiannet/p/3510586.html
回車: Carriage Return,
換行:Line Feed。Feed line into the computer,把一行字符輸入到計算機中。
符號 ASCII碼 意義
\n 10 換行
\r 13 回車CR
在計算機還沒有出現之前,有一種叫做電傳打字機(Teletype Model 33,Linux/Unix下的tty概念也來自於此)的玩意,每秒鍾可以打10個字符。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字符。要是在這0.2秒里面,又有新的字符傳過來,那么這個字符將丟失。
於是,研制人員想了個辦法解決這個問題,就是在每行后面加兩個表示結束的字符。一個叫做“回車”,告訴打字機把打印頭定位在左邊界;另一個叫做“換行”,告訴打字機把紙向下移一行。這就是“換行”和“回車”的來歷,從它們的英語名字上也可以看出一二。
后來,計算機發明了,這兩個概念也就被般到了計算機上。那時,存儲器很貴,一些科學家認為在每行結尾加兩個字符太浪費了,加一個就可以。於是,就出現了分歧。
在Windows中:
- '\r' 回車,回到當前行的行首,而不會換到下一行,如果接着輸出的話,本行以前的內容會被逐一覆蓋;
- '\n' 換行,換到當前位置的下一行,而不會回到行首;
Unix系統里,每行結尾只有“<換行>”,即"\n";
Windows系統里面,每行結尾是“<回車><換行>”,即“\r\n”;
Mac系統里,每行結尾是“<回車>”,即"\r";。
一個直接后果是,Unix/Mac系統下的文件在Windows里打開的話,所有文字會變成一行;而Windows里的文件在Unix/Mac下打開的話,在每行的結尾可能會多出一個^M符號。