原文链接:http://www.zhoubotong.site/post/38.html
端口被占用网上很多,这种频繁操作的命令容易忘记,写这边文章的目的主要是加深操作命令的印象,
Liux 查看端口占用情况可以使用 lsof 和 netstat 命令。
lsof lsof(list open files)是一个列出当前系统打开文件的工具。
lsof 查看端口占用语法格式:
lsof -i:端口号 使用实例 查看服务器 3306 端口的占用情况
[zpt@iZXw45Z ~]$ sudo lsof -i:3306 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 28165 mysql 33u IPv6 165455798 0t0 TCP *:mysql (LISTEN) 可以看到 3306 端口已经被mysql 服务占用。注意:lsof -i 需要 root 用户的权限来执行,
这里补充下上图lsof命令输出的各列的含义:
COMMAND: 进程的名称 PID: 进程标识符 USER: 进程所有者 FD: 文件描述符,应用程序通过文件描述符识别该文件 TYPE: 文件类型 DEVICE: 以逗号分隔设备编号(磁盘名称) SIZE: 文件的大小(bytes) NODE: 索引节点(文件在磁盘上的标识) NAME: 打开文件的确切名称 FD(文件描述列表) cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改 txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序 lnn:library references (AIX); er:FD information error (see NAME column); jld:jail directory (FreeBSD); ltx:shared library text (code and data); mxx :hex memory-mapped type number xx.
目录1 监控mybatis下SQL1.1 Druid简介1.2 添加pom.xml依赖1.3 配置相关属性1.3.1 如何配置 Filter1.4 监控页面1.5 sql监控1.6 慢sql记录1.7 spring 监控1.8 去 Ad(广告)1.9 获取Druid的监控数据2 监控mybatis-plus下SQL2.1 pom.xml2.2 application.yml2.3 相关配置信息
1 监控mybatis下SQL 1.1 Druid简介 Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource等等等,秒杀一切。
Druid可以很好的监控 DB池连接和 SQL 的执行情况,天生就是针对监控而生的 DB 连接池。
Spring Boot 默认数据源 HikariDataSource 与 JdbcTemplate中已经介绍 Spring Boot 2.x 默认使用 Hikari 数据源,可以说 Hikari 与 Driud 都是当前 Java Web 上最优秀的数据源。
其中的监控器:
stat:Druid内置提供一个StatFilter,用于统计监控信息。 wall:Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析。Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。 log4j2:这个就是 日志记录的功能,可以把sql语句打印到log4j2供排查问题。 1.2 添加pom.xml依赖 <!-- 阿里巴巴的druid数据源 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.23</version> </dependency> <!
1. 环境准备 1.1 安装规划 角色 IP 组件 k8s-master1 192.168.80.45 etcd, api-server, controller-manager, scheduler, docker k8s-node01 192.168.80.46 etcd, kubelet, kube-proxy, docker k8s-node02 192.168.80.47 etcd, kubelet, kube-proxy, docker 软件版本:
软件 版本 备注 OS Ubuntu 16.04.6 LTS Kubernetes 1.19.11 Etcd v3.4.15 Docker 19.03.9 1.2 系统设置 # 1.
全局锁和表锁 :给表加个字段怎么有这么多阻碍? 根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。
全局锁 全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。
全局锁的典型使用场景是,做全库逻辑备份。也就是把整库每个表都 select 出来存成文本。
在备份过程中整个库完全处于只读状态。
如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆; 如果在从库上备份,那么备份期间从库不能执行主库同步过来的 binlog,会导致主从延迟。 但是不加锁的话,备份系统备份的得到的库不是一个逻辑时间点,这个视图是逻辑不一致的。
官方自带的逻辑备份工具是 mysqldump。当 mysqldump 使用参数–single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。
有了这个功能,为什么还需要 FTWRL 呢?一致性读是好,但前提是引擎要支持这个隔离级别。比如,对于 MyISAM 这种不支持事务的引擎,如果备份过程中有更新,总是只能取到最新的数据,那么就破坏了备份的一致性。这时,我们就需要使用 FTWRL 命令了。
所以,single-transaction 方法只适用于所有的表使用事务引擎的库。如果有的表使用了不支持事务的引擎,那么备份就只能通过 FTWRL 方法。这往往是 DBA 要求业务开发人员使用 InnoDB 替代 MyISAM 的原因之一。
既然要全库只读,为什么不使用 set global readonly=true 的方式呢?确实 readonly 方式也可以让全库进入只读状态,但还是建议用 FTWRL 方式,主要有两个原因:
一是,在有些系统中,readonly 的值会被用来做其他逻辑,比如用来判断一个库是主库还是备库。因此,修改 global 变量的方式影响面更大,我不建议你使用。 二是,在异常处理机制上有差异。如果执行 FTWRL 命令之后由于客户端发生异常断开,那么 MySQL 会自动释放这个全局锁,整个库回到可以正常更新的状态。而将整个库设置为 readonly 之后,如果客户端发生异常,则数据库就会一直保持 readonly 状态,这样会导致整个库长时间处于不可写状态,风险较高。 表级锁 MySQL 里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。
sql 关键字** union** 与 intersect 属于以行方向为单位的集合运算,进行这些集合运算时,会导致记录行数的增加或减少。 关键字 join 则是属于列方向的运算,将其他表中的列添加过来。 我们称这种操作为连接。
INNER JOIN / 内连接 内联结只会提取同时存在于两张表中的数据。 和用select查询多表是一样的效果,实际较少用到 使用
select from inner join t2 on join_condition1 INNER JOIN t3 ON join_condition2 ... where OUTER JOIN / 外连接 只要数据存在于某一张表中,就能够提取出来。 使用
select from inner join t2 on join_condition1 INNER JOIN t3 ON join_condition2 ... where CROSS JOIN / 交叉连接
版本说明: django 4.0 python 3.10
安装mysqlclient 说明: django推荐使用mysqlclient而不是pymysql pip install mysqlclient 修改配置 项目包目录下的setting.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'test', 'USER': 'root', 'PASSWORD': 'abcd1234', 'HOST': 'localhost', 'port': '3306', } }
在日常业务开发中,为了解决并发问题,比如,同一个时刻,多笔相同订单号的订单同时请求,我们只会受理一笔,其他的请求拒绝。我们通常都是用分布锁来解决,当然,也可以使用数据库的唯一索引来解决,数据新增的时候会报插入异常,这样如果系统并发很大,会给数据库造成很大的压力,通常都不会这么操作。 实现分布式锁的方案有很多种,比如用 zookeeper、redis等中间件,本文主要介绍使用 redission 实现分布锁,主要原因有以下几点:
生产有redis 哨兵集群,不需要在部署其他中间件环境 redission 有看门狗机制,能自动给分布式锁延期(这个可以网上搜索参考其他文章) 一、环境说明 maven 依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.2.RELEASE</version> </dependency> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.11.2</version> </dependency> 二、代码实现 @Configuration @Setter @ConfigurationProperties(prefix = spring.redis.lettuce.pool) public class RedisClientConfig { @Value(${redis.clusterName}) private String clusterName; @Value(${redis1.host}) private String redis1Host; @Value(${redis1.port}) private Integer redis1Port; @Value(${redis2.host}) private String redis2Host; @Value(${redis2.port}) private Integer redis2Port; @Value(${redis3.host}) private String redis3Host; @Value(${redis3.port}) private Integer redis3Port; @Bean public RedissonClient redissonClient() { Config config = new Config(); config.
1.获取当前session的连接ID
mysql> select connection_id();+-----------------+| connection_id() |+-----------------+| 121 |+-----------------+1 row in set (0.00 sec)
2.获取当前session的线程id
mysql> select ps_current_thread_id();+------------------------+| ps_current_thread_id() |+------------------------+| 180 |+------------------------+1 row in set (0.00 sec)
一般情况下一个连接id对应一个线程id
1、以管理员身份运行cmd; 2、先将mysql停止运行: net stop mysql; 3、 在命令行输入: mysqld -nt --skip-grant-tables; 4、 重启以管理员身份运行一个cmd,输入: mysql -uroot -p Enter进入数据库; 5、如果只想查看原来的密码,可以执行以下语句: select host,user,password from mysql.user; 如果要修改密码,在命令行下执行下面语句: use mysql; update user set password=password(new_pass) where user=root; flush privileges; exit
引用自:SqlBulkCopy - 青兰柳 - 博客园 (cnblogs.com) SqlBulkCopy 批量插入数据
新建一个table
DataTable table = new DataTable(); //声明表(该表存于本地服务器端,输入插入该表之后,再将这张表插入数据库) table.Columns.Add(Id); table.Columns.Add(Column1); table.Columns.Add(Column2); 。。。。。。。。 从其他地方读取数据比如excel表格,txt等
using (System.IO.StreamReader sr = new System.IO.StreamReader(@文件地址)){ // 从文件读取并显示行,直到文件的末尾 while (!string.IsNullOrEmpty(line = sr.ReadLine())) { string[] items = line.Split(';'); var column1= items[0]); var column2 = items[1]); var column3 = ipitems[2]; DataRow row = table.NewRow(); row[Id]=index; row[Column1] = column1; row[Column2] = column2 ; row[Column3] = column3; //根据数据库表设计改变类型 table.Rows.Add(row); //查看索引值 System.Diagnostics.Debug.WriteLine(index); index++; } } using (SqlBulkCopy buckCopy = new SqlBulkCopy(dbHelperSQLP.