[排错] 解决 Linux 启动时某些服务没有开机自启 (日志里报错: “deleted to break ordering cycle starting”)

报错代码

某些服务没有开机自启例如 NetworkManager.service

原因分析

在系统日志里可以类似 …… Job network.target/start deleted to break ordering cycle starting with …… 报错例如:

# cat /var/log/messages
Jan 1 10:09:24 server systemd[1]: network-online.target: Found ordering cycle on network.target/start
Jan 1 10:09:24 server systemd[1]: network-online.target: Found dependency on NetworkManager.service/start
Jan 1 10:09:24 server systemd[1]: network-online.target: Found dependency on basic.target/start
Jan 1 10:09:24 server systemd[1]: network-online.target: Found dependency on slices.target/start
Jan 1 10:09:24 server systemd[1]: network-online.target: Found dependency on mysql.slice/start
Jan 1 10:09:24 server systemd[1]: network-online.target: Found dependency on remote-fs.target/start
Jan 1 10:09:24 server systemd[1]: network-online.target: Found dependency on remote-fs-pre.target/start
Jan 1 10:09:24 server systemd[1]: network-online.target: Found dependency on iscsi.service/start
Jan 1 10:09:24 server systemd[1]: network-online.target: Found dependency on network-online.target/start
Jan 1 10:09:24 server systemd[1]: network-online.target: Job network.target/start deleted to break ordering cycle starting with network-online.target/start
Jan 1 10:09:24 server systemd[1]: NetworkManager-wait-online.service: Found ordering cycle on NetworkManager.service/start
Jan 1 10:09:24 server systemd[1]: NetworkManager-wait-online.service: Found dependency on basic.target/start
Jan 1 10:09:24 server systemd[1]: NetworkManager-wait-online.service: Found dependency on slices.target/start
Jan 1 10:09:24 server systemd[1]: NetworkManager-wait-online.service: Found dependency on mysql.slice/start
Jan 1 10:09:24 server systemd[1]: NetworkManager-wait-online.service: Found dependency on remote-fs.target/start
Jan 1 10:09:24 server systemd[1]: NetworkManager-wait-online.service: Found dependency on remote-fs-pre.target/start
Jan 1 10:09:24 server systemd[1]: NetworkManager-wait-online.service: Found dependency on iscsi.service/start
Jan 1 10:09:24 server systemd[1]: NetworkManager-wait-online.service: Found dependency on network-online.target/start
Jan 1 10:09:24 server systemd[1]: NetworkManager-wait-online.service: Found dependency on NetworkManager-wait-online.service/start
Jan 1 10:09:24 server systemd[1]: NetworkManager-wait-online.service: Job NetworkManager.service/start deleted to break ordering cycle starting with NetworkManager-wait-online.service/start

从案例中日志里的内容可以判断:
1) network.target/NetworkManager.service 启动
2) NetworkManager.service 作为基础服务依赖 basic.target
3) basic.target 依赖所有 slice 包括 mysql.slice
4) mysql.slice 依赖 iscsi.service/remote-fs.target/remote-fs-pre.target
5) iscsi.service/remote-fs.target/remote-fs-pre.target 依赖 network.target/NetworkManager.service
6) 系统为了防止启动时陷入死循环,systemd 报错 Job NetworkManager.service/start deleted to break ordering cycle 并放弃启动 NetworkManager.service

解决方法

取消不太重要的服务的依赖要求

# vi /etc/systemd/system/mysql.slice

将以下内容:

......
Before=slices.target
Wants=-.slice
After=-.slice remote-fs.target
......

修改为:

......
Before=slices.target
Wants=-.slice
After=-.slice remote-fs.target
......

(补充:这里以取消使用 /etc/systemd/system/mysql.slice 文件的服务的依赖要求为例)

[命令] Linux 命令 hostname (修改主机名、显示主机名和 IP 地址)

内容一:修改 Linux 主机名

[root@server ~]# hostnamectl set-hostname eternalcenter.com

内容二:显示已经修改的主机名

2.1 显示已经修改的部分主机名

[root@eternalcenter ~]# hostname
eternalcenter

(补充:这里只会显示 “.” 符号前面的内容,“.” 后面的内容不会在这里显示)

2.2 显示已经修改的全部主机名,也就是 FQDN

[root@eternalcenter ~]# hostname -f
eternalcenter.com

内容三:显示 IP 地址

3.1 显示本地最后 1 个 IP 地址

[root@eternalcenter ~]# hostname -i

3.2 显示本地所有 IP 地址

[root@eternalcenter ~]# hostname -I

[命令] Linux 命令 timeout 的使用 (设置在几秒之后结束要执行的命令)

内容一:timeout 命令的格式

# timeout <option> <duration> <command> ......

(补充:这里的 duration 是数字,默认单位是秒。也可以手动指定时间单位,时间单位可以是 s 秒、m 分钟、h 小时、d 天)

内容二:timeout 命令的选项

1) -k, –kill-after=DURATION 当时间到了以后强制杀死命令
2) -p, –preserve-status 当结束时保持命令本身结束时的退出代码

[内容] MariaDB & MySQL 大量连接数和高消耗 SQL 语句的临时处理

内容一:数据库连接数处理

1.1 查看数据库连接数

1.1.1 查看已设置的最大连接数
mysql> show variables like 'max_connections';

或者:

mysql> show variables like '%connect%';
1.1.2 查看试图连接数
mysql> show status like '%connect%';
1.1.3 查看目前的连接数
mysql> show status like 'Threads_connected';

或者:

mysql> show status where variable_name = 'Threads_connected';

1.2 需改数据库最大连接数

1.2.1 修改 /etc/my.cnf 配置文件
# vi /etc/my.cnf

添加以下内容:

......
max_connections=32000
1.2.2 重启 MySQL 数据库

(步骤略)

内容二:高消耗 SQL 语句处理

2.1 查看被锁住的表

mysql> select * from information_schema.innodb_trx where trx_state='LOCK WAIT';

(补充:可以通过被锁住的表推断哪些 SQL 语句耗时较长)

2.2 查看 SQL 语句

2.2.1 查看所有的 SQL 语句
mysql> show processlist
2.2.2 查看所有的 SQL 语句并按照耗时长短排序
mysql> select id,user,host,state,info,time,command 
  from information_schema.processlist 
  where command !='Sleep'
  order by time desc;


补充:
1) 这里以显示 information_schema.processlist 表里的 id、user、host、state、info、time、command 字段为例
2) 这里的 where command != ‘Sleep’ 代表排除处于睡眠状态的 SQL 语句

2.2.3 查看耗时最高的 10 条 SQL 语句并按照耗时长短排序
mysql> select *
from information_schema.processlist
where command != 'Sleep'
  and time > 0 
order by time desc
limit 10;


补充:
1) 这里以显示 information_schema.processlist 表里的所有字段为例
2) 这里的 where command != ‘Sleep’ 代表排除处于睡眠状态的 SQL 语句

2.2.4 查看对某个数据库进行操作的耗时最高的 10 条 SQL 语句
mysql> select id,user,host,state,info,time,command 
  from information_schema.processlist 
  -- where db = 'eternalcenter'
  where command !='Sleep'
  order by time desc;


补充:
1) 这里以显示 information_schema.processlist 表里的 id、user、host、state、info、time、command 字段为例
2) 这里的 — where db = ‘eternalcenter’ 代表查看对 eternalcenter 库进行操作的 SQL 语句
3) 这里的 where command != ‘Sleep’ 代表排除处于睡眠状态的 SQL 语句

2.3 杀死高消耗的 SQL 语句

2.3.1 杀死某条 SQL 语句
mysql> kill <SQL ID>
2.3.2 杀死正在运行的耗时最高的 5 条 SQL 语句
mysql> select concat('kill ',id,';')
from information_schema.processlist
where command ='Query' 
order by time desc
limit 5;
2.3.3 确认正在运行的耗时最高的 5 条 SQL 语句被杀死
mysql> select ID,COMMAND,INFO 
from information_schema.processlist
where command ='Query' 
order by time desc
;