/tmp/
定时每分钟执行,将etc的ls内容重定向到tmp下文件中。
一周中的星期几?
特殊符号:
代表不连续的时间,比如0 8,12,16 * * *? 代表每天的8点0分,12点0分,16点0分都执行一次
(3)应用实例
*/1 * * * * date >> /tmp/
步骤:
vim /home/ 写入内容 date >> /home/mydate 和 cal >> /home/mydate 给增加执行权限,chmod u+x /home/ crontab -e 增加?*/1 * * * *??/home/
指令:mysqldump -u root -p密码 数据库 > /home/
crontab -e 0 2?* * *??mysqldump -u root -proot testdb > /home/
(4)at定时任务
at [选项][时间]
Ctrl + D 结束at命令的输入
(1)进程号
在Linux中,每个执行的程序都称为一个进程,每一个进程都会分配一个ID号(pid,进程号)。
(2)ps指令
显示系统执行的进程
属性:
-a:显示当前终端的所有进程信息
-u:以用户的格式显示进程信息
-x:显示后台进程运行的参数
分页显示:ps -aux | more
过滤显示:ps -aux | grep sshd
(3)ps显示信息详解
USER:用户名称 PID:进程号 %CPU:进程占用CPU的百分比 VSZ:进程占用的虚拟内存大小(单位:KB) RSS:进程占用的物理内存大小(单位:KB) TT:终端名称,缩写 STAT:进程状态(S-睡眠,s-表示该进程是会话的先导进程,N-表示进程拥有比普通优先级更低的优先级,R-正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止等等) STARTED:进程的启动时间 TIME:CPU时间,即进程使用CPU的总时间 COMMAND:启动进程所用的命令和参数,如果过长会被截断显示
(4)终止进程
kill和killall
基本语法:
kill [选项] 进程号(功能描述:通过进程号杀死进程)
killall 进程名称 (功能描述:通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用)
常用选项:-9 表示强制停止进程。
(5)查看进程树
pstree [选项],可以更加直观的查看进程信息
常用选项:
-p:显示进程的pid
-u:显示进程的所属用户
(1)简介
服务本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如mysql、sshd、防火墙等,因此我们又称之为守护进程,是Linux中非常重要的知识点。
(2)service管理指令
service 服务名[start | stop | restart | reload | status] 在后,很多服务不再使用service,而是使用systemctl service指令管理的服务在/etc/查看
(3)chkconfig指令
通过chkconfig可以给服务的各个运行级别设置自启动/关闭。
基本语法:
chkconfig --list [| grep xxx] chkconfig 服务名 --list chkconfig --level 5 服务名 on/off
(4)systemctl指令
基本语法:
systemctl [start | stop | restart | reload | status] 服务名
systemctl指令管理的服务在/us/lib/systemd/system查看
systemctl设置服务的自启动状态
systemctl list-unit-files [|grep 服务名](查看服务开机启动状态,grep可以进行过滤) systemctl enable 服务名(设置服务开机启动) systemctl disable 服务名(关闭服务开机启动) systemctl is-enabled 服务名(查询某个服务示范是自启动的)
应用案例:
查看当前防火墙的状况,关闭防火墙和重启防火墙。
systemctl status firewalld;
systemctl stop firewalld;
systemctl start firewalld;
(5)firewall指令
打开端口:firewall-cmd --permanent --add-port=端口号/协议 关闭端口:firewall-cmd --permanent --remove-port=端口号/协议 重新载入,才能生效:firewall-cmd --reload 查询端口是否开放:firewall-cmd --query-port=端口号/协议
定义: 多个SQL语句的集合,就像是函数,但是它没返回值
优点: 一次连接,执行存储过程中所有的SQL语句,效率高
只在创建时编译一次,之后不编译;可以重复使用,提高开发效率
安全性高: 可以设定某个用户是否具有某个存储过程的使用权限
触发器: 需要有触发条件,当条件满足以后做什么操作
例如1: 校内网,开心网,facebook,你发一个日志,自动通知好友,其实就是增加日志时做的一个后触发,再向_通知表_写入条目。==> 触发器的效率高
Q:redo log 和 undo log 区别在哪?
这两种日志是属于 InnoDB 存储引擎的日志,它们的区别在于:
应用场景
之前已经说过,innodb支持事务,它具有事务日志redo/undo,而myisam不支持事务,它没有这两种事务日志。
在事务提交之前,会先写入redo/undo日志
1. 是 Innodb 存储引擎层生成的日志,实现了事务中的持久性,主要用于掉电等故障恢复
2. 保证: 所有已经提交的事务的数据仍然存在
redo_log作用: 用于记录事务的变化,记录的是数据修改之后的值,不管事务是否提交都会记录。如果某时刻系统宕机,重启后,可以通过redo log恢复之前的数据
数据库宕机恢复过程: 先从redo log中把未落盘的脏页数据恢复回来,重新写入磁盘,保证用户数据不丢失
redo_log写入磁盘过程: 先写入redo log buffer(redo log缓存),之后调用fsync,刷新写入redo log物理磁盘(它的写入是可进行参数配置的)
1. 是 Innodb 存储引擎层生成的日志,实现了事务中的原子性,主要用于事务回滚和 MVCC
2. 保证: 所有没有提交的事务的数据自动回滚
数据更新时,会先写入undo log(该操作和数据更新执行操作相反,即如果是插入数据,则undo log是删除数据)
回滚: 当事务失败或回滚时,根据undo log,把未提交的事务回滚到更新前的状态
1. 是 Server 层生成的日志,主要用于数据备份和主从复制;
2. 不管SQL使用那种存储引擎,都有Binlog,它是Server层的(而redo log是innodb层的)
SQL会为每一个事务,分配一个事务ID(XID)
commit被分为2个阶段: papare/commit
Binlog会被当作事务协调者
step1: 准备阶段(papare)
1. 此时SQL已经成功执行,生成XID信息以及Redo/Undo的内存日志
2. 然后调用papare方法,将事务状态设置为TRX_PREPARED,并将Redo/Undo log刷入磁盘
step2: 提交阶段(commit)
(1)提交 or 回滚
如果事务涉及的所有存储引擎的papare都执行成功,则将SQL语句写入Binlog,调用fsync写入磁盘
如果事务涉及的所有存储引擎的papare都执行失败,则SQL语句不会写入Binlog,此时事务回滚
(2)告诉引擎进行commit
(假设papare成功,完成事务提交)会清除undo信息,调用fsync刷redo日志到磁盘,将事务设置为TRX_NOT_STARTED状态
不是的。redo log 也有自己的缓存—— redo log buffer(默认大小 16 MB)
InnoDB在缓冲池中变更数据时,会产生一条redo log
缓存在 redo log buffer 里的 redo log 还是在内存中,它什么时候刷新到磁盘?
主要有下面几个时机:
操作系统的文件系统是带有缓存的,当InnoDB向磁盘写入数据时,有可能只是写入到了文件系统的缓存中,没有真正的“落袋为安”。InnoDB的innodb_flush_log_at_trx_commit属性,可以控制每次事务提交时InnoDB的行为(根据innodb_flush_log_at_trx_commit选项的值,决定不同的策略)
这两个日志有四个区别。
1.适用对象不同:
2.文件格式不同:
3.写入方式不同:
4.用途不同:
如果不小心整个数据库的数据被删除了,能使用 redo log 文件恢复数据吗?
答:不可以使用 redo log 文件恢复,只能使用 binlog 文件恢复。
因为 redo log 文件是循环写,是会边写边擦除日志的,只记录未被刷入磁盘的数据的物理日志,已经刷入磁盘的数据都会从 redo log 文件里擦除。
binlog 文件保存的是全量的日志,也就是保存了所有数据变更的情况,理论上只要记录在 binlog 上的数据,都可以恢复,所以如果不小心整个数据库的数据被删除了,得用 binlog 文件恢复数据
显示启动事务: begin/start transaction,commit/roolback
set autocommit=0 该命令会将这个线程的自动提交关闭掉,即:
只要你执行一个select语句,事务就启动了,而且并不会自动提交(直到你主动执行commit\rollback语句,或者断开连接)
建议: 总是使用set autocommit=1
为什么尽量避免长事务?
长事务意味着系统里面会存在很老的事务视图,在这个事务提交之前,回滚记录都要保留,这会导致占用大量的存储空间
长事务还占用锁资源,可能会拖垮库
长事务,commit后才会写入binlog,会造成主从延时问题
默认情况下, InnoDB 存储引擎有 1 个重做日志文件组( redo log Group),「重做日志文件组」由有 2 个 redo log 文件组成,这两个 redo 日志的文件名叫 :ib_logfile0
和 ib_logfile1
重做日志文件组是以循环写的方式工作的,从头开始写,写到末尾就又回到开头,相当于一个环形。
在重做日志组中,每个 redo log File 的大小是固定且一致的,假设每个 redo log File 设置的上限是 1 GB,那么总共就可以记录 2GB 的操作。
所以 InnoDB 存储引擎会先写 ib_logfile0 文件,当 ib_logfile0 文件被写满的时候,会切换至 ib_logfile1 文件,当 ib_logfile1 文件也被写满时,会切换回 ib_logfile0 文件。
我们知道 redo log 是为了防止 Buffer Pool 中的脏页丢失而设计的,那么如果随着系统运行,Buffer Pool 的脏页刷新到了磁盘中,那么 redo log 对应的记录也就没用了,这时候我们擦除这些旧记录,以腾出空间记录新的更新操作。
redo log 是循环写的方式,相当于一个环形,InnoDB 用 write pos 表示 redo log 当前记录写到的位置,用 checkpoint 表示当前要擦除的位置(checkpoint可以理解为环形队列中的read pos,向前移动,即read数据,写入磁盘),如下图:
图中的:
如果 write pos 追上了 checkpoint,就意味着 redo log 文件满了,这时 MySQL 不能再执行新的更新操作,也就是说 MySQL 会被阻塞(因此所以针对并发量大的系统,适当设置 redo log 的文件大小非常重要),此时①会停下来将 Buffer Pool 中的脏页刷新到磁盘中,②然后标记 redo log 哪些记录可以被擦除,③接着对旧的 redo log 记录进行擦除,等擦除完旧记录腾出了空间,④checkpoint 就会往后移动(图中顺时针),然后 MySQL 恢复正常运行,继续执行新的更新操作。
所以,一次 checkpoint 的过程就是脏页刷新到磁盘中变成干净页,然后标记 redo log 哪些记录可以被覆盖的过程。
具体更新一条记录 _ t_user SET name = 'xiaolin' WHERE id = 1;
的流程如下:
两阶段提交把单个事务的提交拆分成了 2 个阶段,分别是「准备(Prepare)阶段」和「提交(Commit)阶段」,每个阶段都由协调者(Coordinator)和参与者(Participant)共同完成。
注意:不要把提交(Commit)阶段和 commit 语句混淆了,commit 语句执行的时候,会包含提交(Commit)阶段
事务的提交过程有两个阶段,就是将 redo log 的写入拆成了两个步骤:prepare 和 commit,中间再穿插写入binlog,具体如下:
prepare 阶段:将 XID(内部 XA 事务的 ID) 写入到 redo log,同时将 redo log 对应的事务状态设置为 prepare,然后 将 redo log 持久化到磁盘(innodb_flush_log_at_trx_commit = 1 的作用);
commit 阶段:把 XID 写入到 binlog,然后 将 binlog 持久化到磁盘(sync_binlog = 1 的作用),接着调用引擎的提交事务接口,将 redo log 状态设置为 commit (此时该状态并不需要持久化到磁盘,只需要 write 到文件系统的 page cache 中就够了,因为只要 binlog 写磁盘成功,就算 redo log 的状态还是 prepare 也没有关系,一样会被认为事务已经执行成功)
什么是双1?
双1的缺陷:两阶段提交虽然保证了两个日志文件的数据一致性,但是性能很差,主要有2个方面的影响
MySQL 引入了 binlog 组提交(group commit)机制,当有多个事务提交的时候,会将多个 binlog 刷盘操作合并成一个,从而减少磁盘 I/O 的次数,如果说 10 个事务依次排队刷盘的时间成本是 10,那么将这 10 个事务一次性一起刷盘的时间成本则近似于 1。
引入了组提交机制后,prepare 阶段不变,只针对 commit 阶段,将 commit 阶段(参考章节)拆分为三个过程:
上面的每个阶段都有一个队列,每个阶段有锁进行保护,因此保证了事务写入的顺序,第一个进入队列的事务会成为 leader,leader领导所在队列的所有事务,全权负责整队的操作,完成后通知队内其他事务操作结束。
对每个阶段引入了队列后,锁就只针对每个队列进行保护,不再锁住提交事务的整个过程,可以看的出来,锁粒度减小了,这样就使得多个阶段可以并发执行,从而提升效率。
接下来介绍每个阶段的过程:
①flush 阶段:多个事务按进入的顺序将 binlog 从 cache 写入文件(不刷盘)
第一个事务会成为 flush 阶段的 Leader,此时后面到来的事务都是 Follower:
接着,获取队列中的事务组,由绿色事务组的 Leader 对 redo log 做一次 write + fsync,即一次将同组事务的 redolog 刷盘:
完成了 prepare 阶段后,将绿色这一组事务执行过程中产生的 binlog 写入 binlog 文件(调用 write,不会调用 fsync,所以不会刷盘,binlog 缓存在操作系统的文件系统中)。
从上面这个过程,可以知道 flush 阶段队列的作用是用于支撑 redo log 的组提交。
如果在这一步完成后数据库崩溃,由于 binlog 中没有该组事务的记录,所以 MySQL 会在重启后回滚该组事务。
②sync 阶段:
绿色这一组事务的 binlog 写入到 binlog 文件后,并不会马上执行刷盘的操作,而是会等待一段时间,这个等待的时长由 Binlog_group_commit_sync_delay
参数控制,目的是为了组合更多事务的 binlog,然后再一起刷盘。
不过,在等待的过程中,如果事务的数量提前达到了 Binlog_group_commit_sync_no_delay_count
参数设置的值,就不用继续等待了,就马上将 binlog 刷盘
组提交参数设置
如果在这一步完成后数据库崩溃,由于 binlog 中已经有了事务记录,MySQL会在重启后通过 redo log 刷盘的数据继续进行事务的提交。
③commit 阶段
最后进入 commit 阶段,调用引擎的提交事务接口,将 redo log 状态设置为 commit。
commit 阶段队列的作用是承接 sync 阶段的事务,完成最后的引擎提交,使得 sync 可以尽早的处理下一组事务,最大化组提交的效率。
查看:ls -ahl
修改文件所有者:chown 用户名 文件名
创建组:groupadd 组名
创建一个用户tom,并将其放入moster组中
useradd -g monster tom
ls -l中显示的内容如下:
-rwxrw-r-- 1 root root 1213 Feb 2 09:39 abc
可被执行
0-9位说明
(1)第0位确定文件类型(d,-,l,c,b)
(2)第1-3位确定所有者的权限
(3)第4-6位表示所在组对该文件的权限
(4)第7-9位表示其他用户对该文件的权限
通过chmode指令,可以修改文件或目录的权限
(1)+,-,= 变更权限
u:所有者
q:所在组
o:其它人
a:?所有人
chmod?u=rwx,g=rx,o=x 文件/目录名
chmod?o+w 文件/目录名
chmod a-x?文件/目录名
(2)通过数字变更权限
r=4 w=2 x=1??rwx = 4+2+1=7
chmod?u=rwx,g=rx,o=x 文件/目录名 相当于 chmod 751文件名
基本介绍
chown newowner 文件/目录名 改变所有者
chown newowner:newgroup?文件/目录名 改变所有者和所在组
-R 如果是目录 则使其下所有子文件或目录递归生效
例如:
(1)请将/home/文件的所有者修改为tom
chown tom /home/
(2)请将/home下所有文件的所有者修改为tom
chown -R tom /home
-chgrp newgroup?文件/目录??改变所在组
警察和土匪游戏
police,bandit
Jack,Jerry:警察
zs,ls:土匪
(1)创建组
groupadd police;groupadd bandit
(2)创建用户
useradd -g police jack;
useradd -g police jerry;
useradd -g bandit zs;
useradd -g bandit ls;
(3)jack创建一个文件,自己可以读写,本组人可以读,其它组没任何权限
vim ;
chmod?u=rwx,g=rx,o=x
(4)jack修改该文件,让其他组人可以读,本组人可以读写
chmod o=r,g=r
(5)zs投靠警察,看看是否可以读写
usermod -g police zs
(6)测试,看看zs是否可以读写,ls是否可以
dump线上数据
mysqldump -h主机 -P端口 -u用户 -p密码 --databases 数据库 --tables 表名 --single-transaction > /tmp/
mysql -h主机 -P端口 -u用户 -p密码 --database 数据库 < /tmp/
连接数据库
mysql -h 主机 -P 端口 -u 用户 -p密码; use 数据库
查询Mysql里面目前正在执行的语句
注:本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即后台留言通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意
点击下载
本文文档
发表评论