install it(docker)
docker run --name mysqltest \
-p 3306:3306 \
-v $HOME/_docker/mysql/conf.d:/etc/mysql/conf.d \
-v $HOME/_docker/mysql/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7.23
- --name mysql:容器名字为 mysql
- -p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口
- -v $HOME/_docker/mysql/conf.d:将主机当前目录下的 ~/_docker/mysql/conf.d 挂载到容器的 /etc/mysql/conf.d,这个是挂载配置目录
- -v $HOME/_docker/mysql/data:将主机当前目录下的 data 目录挂载到容器的 /var/lib/mysqs,为数据文件存放路径
- -e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码
登录mysql
mysql -uroot -p
常用命令
- show databases; //有多少个数据库
- use school; //切换到某个数据库
- show tables; //查看数据库中所有的表
- describe student; --显示数据库中所有表的信息
- exit; --退出连接
- SHOW COLUMNS FROM runoob_tbl; // 显示列信息(第一行)
- SHOW INDEX FROM runoob_tbl; // 显示索引信息(第一列,primary key)
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
数据库文件
MySQL如果使用InnoDB存储引擎,数据库文件类型就包括
- .frm 主要存放与表相关的数据信息,主要包括表结构的定义信息
- .ibd 如果使用独享表去存放数据,每个表都有一个ibd
- .ibdata1 如果使用共享表去存放数据,所有表的数据都在一起
备份与还原
Mysql 备份所有的table,databases,以及整个数据库
mysqldump -u username -p dbname table1 table2 ...-> BackupName.sql
mysqldump -u username -p --databases dbname2 dbname2 > Backup.sql
mysqldump -u username -p -all-databases > /home/BackupName.sql
还原
mysql -u root -p [dbname] < backup.sq
- restore 需要dbname存在或者不指定,全部导入。
- mysqldump 本质上是通过查询的方式,把数据导出,不能关闭daemon进程(热备份)
- 冷备份就是直接拷贝文件夹,但要注意mysql信息的一致
增删改查
CREATE DATABASE IF NOT EXISTS codes_user;
CREATE TABLE IF NOT EXISTS `codes_user`(
`user_id` INT UNSIGNED AUTO_INCREMENT,
`user_title` VARCHAR(100) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `user_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO codes_user(user_title,submission_date) VALUES("good2",curdate());
SELECT * FROM codes_user WHERE user_id=2;
SELECT * FROM codes_user WHERE user_title="good";
SELECT * FROM codes_user WHERE BINARY user_title="good"; -- 区分大小写
UPDATE codes_user SET user_title="bad" WHERE user_id=10;
DELETE FROM codes_user WHERE user_id=3;
SELECT * from codes_user WHERE user_title LIKE '%2';
'%a' //以a结尾的数据
'a%' //以a开头的数据
'%a%' //含有a的数据
'_a_' //三位且中间字母是a的
'_a' //两位且结尾字母是a的
'a_' //两位且开头字母是a的
SELECT * from codes_user ORDER BY user_title ASC;
SELECT user_title, COUNT(*) FROM codes_user GROUP BY user_title; -- 统计每个出现的次数
SELECT user_title, SUM(user_id) as user_id_sum FROM codes_user GROUP BY user_title; -- 统计总计的值
-- 能够将几个SQL命令合并成一个原子操作,要么全部执行成功,要么全部执行失败。
begin;
....
commit;
- mysql的大小写是由参数控制的。(windows下默认不区分,linux下默认区分)
- sql的命令大小写不敏感
SQL 注入
以下是SQL注入的几个example
txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
//实际执行可能是这样的,进而获取了所有的用户信息
SELECT * FROM Users WHERE UserId = 105 OR 1=1;
//也可能是这样,恶意删除了相关的信息
SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers;
``
> 不使用用户输入直接生成SQL语句,需要对用户的输入进行检查。
Reference from <https://www.w3schools.com/sql/sql_injection.asp>