连接池

MySQL连接池、Redis连接池 连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个.
每次建立数据库连接都需要发生TCP/IP握手, 并且发生I/O. 通过建立连接池增加复用性.  

相关资料

数据库连接池学习笔记

MySQL并发连接数

MySQL-同时申请链接数, 在MySQL的源码中,默认最大的连接数是16384

异常: SQLSTATE[08004] [1040] Too many connections 当前超出了数据库设置的最大连接数

show variables like '%max_connections%'; 最大连接

相关资料

MySQL连接处理方式及最佳并发连接数设置
mysql连接数
MySQL中too many connections超出最大连接数的处理方法
数据库中间件mysql-proxy细节
mysql服务器最大连接数怎么设置才合理

MySQL-批量入库优化

MySQL批量入库的方式

循环一条一条入库

批量入库

通过程序组合 insert into (字段) tbl vlaues(), vlaues(), vlaues(),...

事务入库

        $autoCommit = (isset($this->startTransaction) ? !$this->startTransaction : true);
        $ids = array();
        if ($autoCommit) {
            $this->startTransaction();
        }
        foreach ($multiInsertData as $insertData) {
            if ($dataKeys !== null) {
                // apply column-names if given, else assume they're already given in the data
                $insertData = array_combine($dataKeys, $insertData);
            }
            $id = $this->insert($tableName, $insertData);
            if (!$id) {
                if ($autoCommit) {
                    $this->rollback();
                }
                return false;
            }
            $ids[] = $id;
        }
        if ($autoCommit) {
            $this->commit();
        }

使用 LOAD DATA INFILE 文件导入

Tip: 通过PHP程序处理好对应格式的内容生成文件, 然后放到数据库服务器中导入操作.

imagecode.txt

http://www.qyule01.fun/media/videos/tmb/000/005/451/1.jpg###100000
http://pic.rmb.bdstatic.com/81923c4cd60b8731b09cc55a0ee82cb8.jpeg###100000
http://pcookie.cnzz.com/app.gif?&cna=Q/1fFKG8SggCAXRVIh2iBCTo###100000
http://inews.gtimg.com/newsapp_ls/0/6134659193_150120/0###100000

load data local infile'/Users/home/xx/temp/xxyun/imagecode.txt'into table imagecode fields terminated by'###'lines terminated by'\n'(url,code);

测试数据

vbox-ubuntu-16.04 2G2核

// 写入一个文件-本地vbox服务器 run time total :0.47590112686157

// 本地vbox服务器-耗费时间: run time total :46.867498874664
// 本地vbox服务器-去除rand函数: run time total :48.011456012726
// 本地vbox服务器-去除var_dump函数: run time total :0.12039113044739
// 本地vbox服务器-使用insertMulti函数 : run time total :43.925640106201

// 内网服务器-耗费时间: run time total :42.424664020538

相关资料

MySQL-关于load data local-详细文档

–secure-file-priv选项问题的解决方法 # show global variables like '%secure_file_priv%';

  • secure_file_priv 为 NULL 时,表示限制mysqld不允许导入或导出。
  • secure_file_priv 为 /tmp 时,表示限制mysqld只能在/tmp目录中执行导入导出,其他目录不能执行。
  • secure_file_priv 没有值时,表示不限制mysqld在任意目录的导入导出。

MySQL LOAD DATA INFILE – 加载没有主键的文件实战

mysql-无法连接

mysql 安装后无法连接数据库 mysql安装 mysql初始化

mysql-5.8

错误提示: The server requested authentication method unknown to the client

use mysql;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

mysql-5.6

错误提示: 1045 access denied for user 'root'@'localhost' using password yes

mysql -uroot tip: 不要加p可以直接进入mysql系统
grant all privileges on *.* to root@'localhost' identified by 'root';
grant all privileges on *.* to root@'%' identified by 'root';
flush privileges;

相关资料

mysql-5.6-无法连接数据库
mysql-5.8-无法连接数据库

mac安装lnmp(lamp)-php环境

安装方式

  • 编译安装
  • brew安装
  • 安装包引导安装

服务

  • php(多个版本)
  • nginx
  • apache
  • MySql(多个版本)
  • redis
  • memcahce
  • composer
  • rabbitmq
  • beanstalkd
  • mongo
  • nodejs

nginx

brew install nginx

/usr/local/var/www 页面项目位置
/usr/local/etc/nginx/nginx.conf 配置文件
/usr/local/etc/nginx/servers 虚拟主机

php5.6

brew tap exolnet/homebrew-deprecated 增加安装源
brew install exolnet/deprecated/php@5.6

错误信息

Error: Your Xcode (10.1) is too outdated.
Please update to Xcode 10.2.1 (or delete it).
Xcode can be updated from the App Store.

A: 打开App Store -> 更新 -> xcode 更新.

nginx+php 配置

server {

    listen 80;
    listen [::]:80;

    # For https
    # listen 443 ssl;
    # listen [::]:443 ssl ipv6only=on;
    # ssl_certificate /etc/nginx/ssl/default.crt;
    # ssl_certificate_key /etc/nginx/ssl/default.key;

    server_name spike.test;
    root /usr/local/var/www/spike;
    index index.php index.html index.htm;

    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

mac-php 默认安装

cp /private/etc/php-fpm.conf.default /private/etc/php-fpm.conf
cp /private/etc/php-fpm.d/www.conf.default /private/etc/php-fpm.d/www.conf

php-fpm -D 启动php

lnmp 启动及关闭

  • brew services stop mysql@5.6 关闭
  • nginx -s stop 关闭
  • brew services stop php@5.6 关闭

实验操作记录

mac-php-最新源码编译安装、模块安装

相关资料

mac 下安装PHP5.6 redis扩展遇到的坑

MySQL-脏读

事务在高并发执行的时候可能会发生脏读、不可重复读、幻读, 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大

事务隔离级别 脏读 不可重复读 幻读
读未提交(read uncommitted)
不可重复读(read committed)
可重复读(repeatable read
串行化(serializable)
  • 未提交读(READUNCOMMITTED)另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)
  • 提交读(READCOMMITTED)本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果(不重复读)
  • 可重复读(REPEATABLEREAD)。在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象
  • 串行化(SERIALIZABLE)。读操作会隐式获取共享锁,可以保证不同事务间的互斥。

MySQL中默认是可重复读(repeatable read)

查看当前session事务级别 show variables like '%tx_isolation%';

查看全局事务隔离级别 show global variables like '%tx_isolation%';

相关资料

MySQL 事务隔离实验-认识:脏读、不可重复读、幻读
MySQL InnoDB四个事务级别 与 脏读、不重复读、幻读

MySQL-锁

乐观锁、悲观锁、共享锁、排他锁、行锁、表锁、死锁

疑问难点

  • 什么是锁?
  • 为什么会出现锁情况?
  • 如果模拟锁情况?

基础知识

锁是计算机协调多个进程或线程并发访问某一资源的机制。锁保证数据并发访问的一致性、有效性;锁冲突也是影响数据库并发访问性能的一个重要因素。锁是Mysql在服务器层和存储引擎层的的并发控制。

加锁是消耗资源的,锁的各种操作,包括获得锁、检测锁是否是否已解除、释放锁等。

相关资料

MySQL-InnoDB-锁概念的理解
MySQL锁总结

mysql 死锁模拟测试
MySQL单表模拟锁和事务的几个场景

InnoDB: Attempted to open a previously opened tablespace

基于docker下的mysql, 一直运行的好好的, 而且早上也还运行正常 突然下午mysql就停止无法启动了.


  1. Open my.ini (my.cnf on linux-based systems and Mac)
  2. Look for [mysqld]
  3. Just below [mysqld] insert innodb_force_recovery = 1
  4. Start MySQL Service
  5. Stop MySQL Service
  6. Remove the line from my.ini (innodb_force_recovery = 1)
  7. Start MySQL Service

laradock

        - ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d #335 line
        - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf

Warning: World-writable config file ‘/etc/mysql/conf.d/my.cnf’ is ignored 权限过大 sudo chmod ./mysql/my.cnf

相关资料

InnoDB: Attempted to open a previously opened tablespace
提示/etc/my.cnf 被忽略的问题处理