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

相关资料

InnoDB: Attempted to open a previously opened tablespace

php-PDO lastInsertId 返回0

当开启事务的情况

获取lastid语句写在commit之后lastid返回的是0

$dbh->beginTransaction(); 
$stmt->execute( array($data ['openid'], $createTime)); 
$dbh->commit(); 
$lastid = $dbh->lastInsertId(); 

获取lastid语句写在commit之前lastid返回的是自增id

$dbh->beginTransaction(); 
$stmt->execute( array($data ['openid'], $createTime)); 
$lastid = $dbh->lastInsertId(); 
$dbh->commit(); 

相关资料

PDO::lastInsertId函数返回0的原因

mysql配置-日志大小限制和自动删除

线上的项目磁盘消耗问题, 发现和MySQL日志有关系.

需要处理的问题

  • 如何限制大小 不让日志无限膨胀?
  • 配置日志不留?
  • 删除的方式和直接删除会对服务有什么影响?

解决方式

限制大小, 保留最近一段时间日志.

  1. set global expire_logs_days=7; # 命令行进入MySQL中, 临时设置保留最近7天日志文件.
  2. expire_logs_days = 7 # 打开 my.cnf 配置文件写入配置, 上面是临时设置的 重启后需要这个文件也要配置下.
  3. max_binlog_size = 100M # 打开 my.cnf 配置文件写入配置, 配置二进制日志每一文件的大小限制为100M.

当修改配置并重启后, 二进制超出配置的部分会被删除, 如果需要之前的日志文件, 注意先备份出来.

上面配置置参考[资料1]

继续阅读

分库分表

文章整理于网上内容, 更多详细内容参考底部[相关资料]

水平分表、垂直分表、水平分库分表、垂直分库

为什么要分库分表? 需要解决什么问题?

业务量高速增长后, 之前的数据表数据读写开始不适应, 响应系统效率及用户体验. 解决I/O问题.

垂直分表

通俗讲”大表拆小表”, 拆表便于开发和维护但是改写以前的查询语句, 会额外带来一定的成本和风险. 拆分字段的操作建议在数据库设计阶段做好.

垂直分库

垂直分库在”微服务”非常普及了, 按照业务模块划分出不同的数据库, 而不是所有的表都放在同一个数据库中.

水平分表

水平分表也叫横向分表, 将表中不同的数据行按照一定规律分布到不同的数据库表中, 降低单表数量, 优化查询性能. 常见方式通过主键或时间等字段进行Hash和取模后拆分. 分表后还是在同一个数据库中还是会有I/O瓶顶.

水平分库分表

思路和水平分表一样, 不同的是分的表在不同的数据库中, 很多大型互联网公司选择的做法.

跨库Join问题

全局表: 类似”数据字典”, 每个库都保留一份.

字段冗余: 需要关联查询的字段做冗余(空间换时间), 避免join.

数据同步: ETLI工具实施

系统层组装: 详见[分库分表的几种常见形式以及可能遇到的难]

跨库事务问题

以往在代码中通过spring注解简单配置就能实现事务的, 现在则需要花很大的成本去保证一致性.

相关资料

分库分表的几种常见形式以及可能遇到的难
大众点评订单系统分库分表实践