k8s自动化运维九

74 阅读4分钟

承接上文k8s自动化运维八-如何清理docker存储的大文件

mysql命令行执行存储过程

  • 先登录远程数据库
  • 查看指定名称的存储过程是否存在,不存在则新建存储过程

image.png

show procedure status where name = '存储过程名称';

vim /opt/proc.sql

CREATE PROCEDURE 存储过程名称(IN name VARCHAR(30))
BEGIN
SELECT student_score FROM tb_students_score WHERE student_name=name;
END
  • 通过命令行创建存储过程
# 修改行分割符
delimiter ;;

# 执行存储过程(行尾没有;)
source /opt/proc.sql

# 恢复行分割符
delimiter ;

(linux中vim proc.sql的时候,esc shift G 光标跳到最后一行,gg光标定位到第一行)

使用gitlab-runner遇到的问题

  • 安装gitlab-runner

这一部分是对自动化运维环境搭建过程快速搭建自动化运维环境中关于gitlab-runner描述的补充

# 查看gitlab-runner服务是否存在

systemctl status gitlab-runner.service -l

ps -ef|grep gitlab

# 停止gitlab-runner服务

systemctl stop gitlab-runner.service -l

# 卸载service服务

./gitlab-runner-linux-amd64 uninstall

# 安装成service服务

./gitlab-runner-linux-amd64 install -u root

# 启动gitlab-runner

./gitlab-runner-linux-amd64 start

或者

systemctl start gitlab-runner.service
  • 安装好gitlab-runner之后,查看启动状态

image.png

--working-directory 这个是数据目录,这里存储了项目源码以及编译之后的内容

image.png

--config /etc/gitlab-runner/config.toml 这个是默认的配置文件,配置文件中存储了已经注册过的runner

image.png

  • 注册一个gitlab-runner到gitlab上

image.png

image.png

注册成功之后,在gitlab runner页面就可以看到了image.png

然后给它设置一个项目就行了,

image.png

提交项目之后,就会自动触发服务部署的过程,这里可能会遇到这样一个问题,

image.png

这一步是在git clone项目源码(第一次clone完整的项目,如果项目比较大的话,就会比较慢),但一直卡在这,去服务器上手动git pull下也是很慢,

image.png

这里配置的项目地址是一个域名,从公网上下载一个大项目,慢是很正常的,

image.png

如果gitlab runner所在的服务器和gitlab在同一个内网环境,这里就可以配置内网ip,这样就会很快了,等第一次把项目下载到服务器上之后,后面的更新就会很快了。

gitlab-ruuner注册到gitlab上,项目的git地址为什么是这个域名呢?这是因为k8s gitlab中配置中的是这个域名

image.png

gitlab的部署过程详见自动化运维环境搭建过程

image.png

mysql sql执行权限

在创建视图或者是存储过程的时候,是需要定义安全验证方式的(也就是安全性SQL SECURITY),其值可以为definer或invoker,表示在执行过程中,使用谁的权限来执行

  • definer:由definer(定义者)指定的用户的权限来执行,

image.png

当定义为DEFINER时,必须数据库中存在DEFINER指定的用户,并且该用户拥有对应的操作权限,才能成功执行。与当前用户是否有权限无关。

  • invoker:由调用这个视图(存储过程)的用户的权限来执行,

image.png

当定义为INVOKER时,只要执行者有执行权限,就可以成功执行。

mysql怎样查询被锁的表

1.查看表是否被锁:

(1)直接在mysql命令行执行 show engine innodb status\G

image.png

具体的分析过程详见MySQL底层原理二之锁机制

(2)查看造成死锁的sql语句,分析索引情况,然后优化sql

(3)然后show processlist

查看进程状态,通过此命令可以查看哪些sql在等待锁

image.png

(4)show status like '%lock%'

获取锁定次数、锁定造成其他线程等待次数,以及锁定等待时间信息,

image.png

当Table_locks_waited与Table_locks_immediate的比值较大,则说明表锁造成的阻塞比较严重,可能需要调整Query语句,亦或者需要调整业务逻辑。

Innodb_row_lock_waits较大,则说明Innodb的行锁比较严重,且影响了其他线程的正常处理,造成Innodb行锁严重的原因可能是Query语句所利用的索引不够合理(Innodb行锁是基于索引来锁定的),造成间隙锁过大。

2.查看表被锁状态和结束死锁步骤:

(1)查看表被锁状态:show OPEN TABLES where In_use > 0; 这个语句记录当前锁表状态

查看哪些表在使用中,In_use列表示有多少线程正在使用某张表,Name_locked表示表名是否被锁,这一般发生在Drop或Rename命令操作这张表时,所以这条命令不能帮助解答这些问题:当前某张表是否有死锁,谁拥有表上的这个锁等,

image.png

(2)查询进程:show processlist查询表被锁进程;查询到相应进程killid

(3)分析锁表的SQL:分析相应SQL,给表加索引,常用字段加索引,表关联字段加索引

(4)查看正在锁的事务:SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS

(5)查看等待锁的事务:SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS

(6)通过navicat kill进程

  • 打开mysql server监控

image.png

  • 选中某些进程 kill

image.png

  • kill之后,需要重启对应应用的进程,因为应用和数据库之间的连接已经断开了,如果没有重连机制,需要重启应用重新与数据库建立连接。