经典Linux面试题一:简述mysql主从复制过程
MySQL 的主从原理和复制过程简述
一、MySQL 复制的基本过程如下:
1. Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
2. Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO 线程。
返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的 Binary Log 文件的名称以及在 BinaryLog 中的位置;
3. Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的RelayLog文件(mysql-relay-lin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到 master-info文件中,以便在下一次读取的时候能够清楚的告诉Master “我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”
4. Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master 端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。这样,实际上就是在 Master 端和 Slave 端执行了同样的 Query,所以两端的数据是完全一样的。
原理:
1. 主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接 主服务器时,它通知 主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。
每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新。
从服务器设置为复制主服务器的数据后,它连接主服务器并等待更新过程。如果主服务器失败,或者从服务器失去与主服务器之间的连接,从服务器保持定期尝试连接,直到它能够继续帧听更新。由--master-connect-retry选项控制重试间隔。 默认为60秒。
每个从服务器跟踪复制时间。主服务器不知道有多少个从服务器或在某一时刻有哪些被更新了。
2. 主从同步过程的相关文件
默认情况,中继日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是从服务器主机名,nnnnnn是序列号。用连续序列号来创建连续中继日志文件,从000001开始。从服务器跟踪索引文件中目前正使用的中继日志。 默认中继日志索引文件名为host_name-relay-bin.index。默认情况,在从服务器的数据目录中创建这些文件。可以用--relay- log和--relay-log-index服务器选项覆盖默认文件名
中继日志与二进制日志的格式相同,并且可以用mysqlbinlog读取。SQL线程执行完中继日志中的所有事件并且不再需要之后,立即自动删除它。没有直接的删除中继日志的机制,因为SQL线程可以负责完成。然而,FLUSH LOGS可以循环中继日志,当SQL线程删除日志时会有影响。
从属复制服务器在数据目录中另外创建两个小文件。这些状态文件默认名为主master.info和relay-log.info。它们包含SHOW SLAVE STATUS语句的输出所显示的信息(关于该语句的描述参见13.6.2节,“用于控制从服务器的SQL语句”)。状态文件保存在硬盘上,从服务器关闭时不会丢失。下次从服务器启动时,读取这些文件以确定它已经从主服务器读取了多少二进制日志,以及处理自己的中继日志的程度。
3.设置mysql主从配置的优点:
1、解决web应用系统,数据库出现的性能瓶颈,采用数据库集群的方式来实现查询负载;一个系统中数据库的查询操作比更新操作要多得多,通过多台查询服务器将 数据库的查询分担到不同的查询服务器上从而提高查询效率。
2、Mysql数据库支持数据库的主从复制功能,使用主数据库进行数据的插入、删除与更新操作,而从数据库则专门用来进行数据查询操作,这样可以将更新操作和 查询操作分担到不同的数据库上,从而提高了查询效率。
mysql索引
普通索引创建索引
这是最基本的索引,它没有任何限制。它有以下几种创建方式:
CREATE INDEX indexName ON mytable(username(length));
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
修改表结构(添加索引)
ALTER table tableName ADD INDEX indexName(columnName)
创建表的时候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );
删除索引的语法
DROP INDEX [indexName] ON mytable;
唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
创建索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
修改表结构
ALTER table mytable ADD UNIQUE [indexName] (username(length))
创建表的时候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
使用ALTER 命令添加和删除索引
有四种方式来添加数据表的索引:
- ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
- ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
- ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
- ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。
以下实例为在表中添加索引。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
你还可以在 ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引:
mysql> ALTER TABLE testalter_tbl DROP INDEX c;
使用 ALTER 命令添加和删除主键
主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL; mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
你也可以使用 ALTER 命令删除主键:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
删除主键时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。
显示索引信息
你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。
尝试以下实例:
mysql> SHOW INDEX FROM table_name; \G
Linux内核的同步机制是什么?
1.什么是同步?
与其解释什么是同步,倒不如告诉读者同步的由来。在Linux内核中,同步技术是为了解决问题而产生的。 说起这个问题,不得不提起可重入内核。
可重入内核:可重入内核即多个进程可以同时在内核态下执行,多个进程的执行事实上说明了进程可以交替执行。
内核态:如果不清楚什么是内核态,简单的说,Linux系统空间分为用户空间和内核空间两大部分,更直白的可以理解为Linux系统将内存分成两块(事实上不止两部分),一块叫做内核空间,一块叫做用户空间,我们经常所说进程运行在用户空间,可以理解为进程所用的内存堆栈空间是位于用户空间中的,而进程在用户空间运行时发生中断或者进程执行某个系统调用(事实上也是一种中断,0x80中断)时,会引起堆栈切换,原来使用的是用户空间堆栈,现在要切换成系统堆栈,这个系统堆栈位于内核空间,因此进程这时就进入(陷入)内核态了。至于这个系统堆栈,是每个进程都必备的资源,在进程结构体tast_struct的thread中保存。
可重入内核运行多个进程交替执行,而进程的切换就发生在内核态下。进程的切换就意味着A进程还未执行结束,就要换B进程执行,如果存在全局变量G,一旦进程切换,这意味着A进程失去对G的控制,其他进程可能对G进行修改等操作,当A进程再次运行时,A进程根本无法知道此时的全局变量G的值还是否是当初进程切换前的那个G。这时候再贸然使用G可能导致致命的后果。
如果还不清楚,举个例子。小明房间里有一双滑板鞋,早上起床上学时看到还在,于是在学校里和同学约好下课一块玩滑板,结果小明房间的门没有锁,在小明离开房间期间,他的弟弟进入房间将滑板拿走了,等小明回去一看,滑板鞋已经不在了。造成的后果就是小明将失信于同学,解决办法就是将房间锁住。
因此,无论是因为并发(多个进程交替执行)还是因此并行(多CPU)而产生的多个进程访问同一资源时,就会产生资源访问竞争,或者说资源访问的顺序及何时获取及释放资源。
如果上面A进程或B进程读全局变量G后又修改了G的值,那么读和修改操作应该是一个单独的、不可中断的操作。否则,一旦进程切换,G的值则就变得不明确了。我们将这些不可中断的操作放到临界区来保证不可中断的特性。那么所谓的临界区就是这样一段代码,进入这段代码的进程必须完整的执行完这段代码,否则,即使进程发生切换,另一个进程也不可能进入这段代码。
同步技术就是为了解决资源访问竞争产生问题的一种方法。
https://www.cnblogs.com/liuwei0773/articles/9506748.html
Shell脚本是什么、它是必需的吗?
1 Shell脚本是什么、它是必需的吗?
答:一个Shell脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Shell脚本)来完成这些日常工作任务。
2 什么是默认登录shell,如何改变指定用户的登录shell
答:在Linux操作系统,“/bin/bash”是默认登录shell,是在创建用户时分配的。使用chsh命令可以改变默认的shell。示例如下所示:
Linux开机引导的步骤是什么?
简述Linux下有关用户和组管理的命令
1、id
id 当前用户自身信息
语法
id 选项 参数(用户名)
选项与参数
id 用户名 显示指定用户的信息
[root@localhost ~]# id uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unco nfined_t:s0-s0:c0.c1023
id –u 用户名 显示指定用户的uid
id –g 用户名 显示指定用户的主组gid
[root@localhost ~]# id -g alice
id –un 用户名 显示指定用户的名字
[root@localhost ~]# id -un alice alice
id –gn 用户名 显示指定用户的主组gid
[root@localhost ~]# id -gn alice g2
2、用户
- useradd 用于创建用户
语法:
useradd 选项 参数(用户名)
选项与参数:
useradd -u 指定 UID
-o 与-u 配合,不检查uid的唯一性
-g GID/组名 指定用户的主要组
-G GID/组名 指定用户的附加组
-c "注释" 用户名
-d 指定用户的默认shell
-N 使用users组做为主要组
-r 创建系统用户
-m 与-r 配合使用,在创建系统用户时,同时创建家目录
-M 创建非系统用户时,不创建家目录
-D 设置默认值,影响以下文件
实例1
[root@localhost ~]# useradd -u 521 abc [root@localhost ~]# id -u abc 521
这个命令创建了一个abc用户,它的UID号为521。
实例2
[root@localhost ~]# useradd -u 521 -o bc [root@localhost ~]# id bc uid=521(abc) gid=522(bc) groups=521(abc)
这个命令-u 和-o配合使用时,会不检查UID是否重复,即使UID号存在仍然可以创建。
实例3
[root@localhost ~]# useradd -G g2 d [root@localhost ~]# id d uid=523(d) gid=523(d) groups=523(d),510(g2)
这个命令创建了一个为d的用户,它的附属组为g2。
- userdel 删除不再使用的用户
语法:
userdel 选项 参数(用户名)
选项与参数:
-r 连带用户的主目录一起删除
-f 强制删除用户
删除命令常用选项是-r,这样可以删的彻底,家目录以及邮箱等都不存在了。
[root@localhost ~]# userdel -r d
- 修改用户权限
usermod
-u UID 用户名 修改指定用户的uid
-g GID/组名 修改用户的主组(该组要先存在)
-G GID/组名[GID2/组名2..] 设置用户的附加组
-a 与-G 配置 增加用户的附加组
-s shell 修改用户的默认shell
-c '注释内容' 修改用户的注释
-d 新地址 用户名 只修改/etc/passwd当中家目录的信息,并不会将目录迁移
-m 与-d 配合使用 修改家目录时,目录一同迁移
note: -d 与地址 一定要连在一起
-l 新名字 旧名字 修改用户的登录名
-L 用户名 锁定用户的密码
-U 用户名 解锁用户的密码
实例4
[root@localhost ~]# usermod -g g1 alice [root@localhost ~]# id alice uid=502(alice) gid=509(g1) groups=509(g1)
修改用户的主组,将主组改为g1。
实例5
[root@localhost ~]# usermod -G g2 alice [root@localhost ~]# id alice uid=502(alice) gid=509(g1) groups=509(g1),510(g2)
将g2设置用户alice的附加组。
实例6
[root@localhost ~]# usermod -s sbin/nologin alice 3、组相关
- groupadd
选项与参数
-g 组ID 组名
-r 自动分区的组ID centos6 < 500 centos7 <1000
例7 [root@localhost ~]# groupadd group1
增加新组group1
例8 [root@localhost ~]# groupadd -g 101 group
添加新组group2,并设组标识号为101。
- groupmod
-n 新组名 当前组名
-g 新ID 当前组名
例9 [root@localhost ~]# groupmod -g 102 group2
将组标识号改为102。
- groupdel
groupdel 组名 删除组
- gpasswd
gpasswd -a username groupname 将指定用户以附加组方式加入到指定组
gpasswd -d username groupname 将指定用户从指定组中删除
gpasswd -A admin1[,admin2……] groupname 设置组管理员,管理员可
以修改组密码,及修改组成员
gpasswd -M user1,user2 groupname 设置组成员列表 (仅root执行)
gpasswd -M '' groupname 删除组成的所有成员
gpasswd -r g roupname 清空指定组的组密码
注意:
每个用户有且只能有一个主要组,但用户可以有零到多个附加组
每个文件只能有一个所属人,和一个所属组
当用户访问一个文件时,首先判断当前用户是否为该文件的所属人owner,
如果是owner,则应用owner位的权限如果不是owner,则判断该用户的所属组当中,是否有一个组与该文件的group相同,如果有,则应用group位的权限,如果都不是,则应用other位。
Linux如何修改文件和文件夹的权限?
-rw------- (600) 只有所有者才有读和写的权限
-rw-r--r-- (644) 只有所有者才有读和写的权限,组群和其他人只有读的权限
-rwx------ (700) 只有所有者才有读,写,执行的权限
-rwxr-xr-x (755) 只有所有者才有读,写,执行的权限,组群和其他人只有读和执行的权限
-rwx--x--x (711) 只有所有者才有读,写,执行的权限,组群和其他人只有执行的权限
-rw-rw-rw- (666) 每个人都有读写的权限
-rwxrwxrwx (777) 每个人都有读写和执行的权限
u 代表所有者(user)
g 代表所有者所在的组群(group)
o 代表其他人,但不是u和g (other)
a 代表全部的人,也就是包括u,g和o
+ 和 - 分别表示增加和去掉相应的权限。+号一般不显示(初学练手时我还是会加上)
在终端输入:
chmod o+w xxx.xxx
chmod o w xxx.xxx 表示给其他人授予写xxx.xxx这个文件的权限
chmod go-rw xxx.xxx 表示删除xxx.xxx中组群和其他人的读和写的权限
chmod ug-r xxx.xxx