mysql
mysql-1 安装、介绍、破解密码
01.mysql发展历史
--
数据库是一个组织,存储,管理数据的软件。
数据的存放演变:
石头,壳,树皮、纸、电子文档、数据库
mysql
oracle
sqlserver mssql
db2
access
postgresql
informix
virtualfox
sybase
......
关系型数据库 (使用sql语言)
-mysql
-sql
-oracle
样例-
员工表
工号 姓名 性别 生日 工资 资金 部门 职位 上级领导工号
非关系型数据库-(nosql)
-redis
-Hbase
-MongodDB
===
02.rpm方式安装mariadb-server-5.5.52-1.el7.x86_64
mysql主流三大分支版本
mysql
mariadb
percona
===
centos7.3上自带的是mariadb
# yum install mariadb\* --只需要本地yum源
# rpm -qa |grep mariadb
mariadb-test-5.5.52-1.el7.x86_64
mariadb-libs-5.5.52-1.el7.x86_64
mariadb-server-5.5.52-1.el7.x86_64
mariadb-5.5.52-1.el7.x86_64
mariadb-devel-5.5.52-1.el7.x86_64
mariadb-bench-5.5.52-1.el7.x86_64
# id mysql --安装后确认有此用户
uid=27(mysql) gid=27(mysql) groups=27(mysql)
# ls /var/lib/mysql/ --没有使用前此目录为空
# systemctl start mariadb 临时启动
# systemctl enable mariadb 开机启动
# ls /var/lib/mysql/ --启动服务后,此目录里有数据
aria_log.00000001 ibdata1 ib_logfile1 mysql.sock test
aria_log_control ib_logfile0 mysql performance_schema
03.mariadb数据库基本操作
# mysql --连接本地mariadb,默认没有密码
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.52-MariaDB MariaDB Server
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
MariaDB [(none)]> select user(); --查看当前默认连接的用户
MariaDB [(none)]> show databases; --或者show schemas;
MariaDB [(none)]> use information_schema; --相当于cd进去
MariaDB [information_schema]> select database(); --类似pwd命令
MariaDB [information_schema]> show tables; --列出当前database或schema下有哪些表
CHARACTER_SETS
TABLES
MariaDB [information_schema]> desc CHARACTER_SETS;
MariaDB [information_schema]> select * from character_sets; --查看表里所有内容
MariaDB [information_schema]> select * from tables\G --如果表的列太多了,可以加\G转换格式
MariaDB [information_schema]> select TABLE_SCHEMA,TABLE_NAME,ENGINE from tables; --只查看其中几列数据
MariaDB [information_schema]> select * from information_schema.CHARACTER_SETS limit 5;
MariaDB [information_schema]> desc mysql.user;
MariaDB [information_schema]> select user,host,password from mysql.user; ===select 字段 from 某数据库.某表;
MariaDB [information_schema]> quit
Bye
# netstat -ntlup |grep :3306 --默认的端口为3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 5721/mysqld
04.mysql配置文件/etc/my.cnf 解析
# cat /etc/my.cnf |grep -v '#' --默认的主配置是/etc/my.cnf
[mysqld] --用中括号括起来的叫参数组,用来针对不同的工具设定参数
datadir=/var/lib/mysql --默认的数据目录
socket=/var/lib/mysql/mysql.sock --socket连接文件,客户端连接服务器文件
symbolic-links=0 --# Disabling symbolic-links is recommended to prevent assorted security risks(建议禁用符号链接以防止各种安全风险)
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log --错误日志,mysql启动不来,请查看此日志 (修改时间为2039年即可实现mysql启动报错 date -s 20390101 )
pid-file=/var/run/mariadb/mariadb.pid --pid文件
05.mysql的socket文件
# rm /var/lib/mysql/mysql.sock
rm: remove socket `/var/lib/mysql/mysql.sock'? y
# mysql --连接报错,找不到socket文件
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
# mysql -h 127.0.0.1 --但是通过tcp/ip连接
--解决方法,重启mysqld(不能从别人机器拷过来,因为socket与本系统相关,是拷不到其它系统上去的)
# systemctl restart mariadb --重启服务,socket文件就又产生了
soctet--
[root@vm1 ~]# mysql -S /var/lib/mysql/mysql.sock
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 5.5.52-MariaDB MariaDB Server
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> quit
Bye
[root@vm1 ~]# mysql --socket /var/lib/mysql/mysql.sock
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 5.5.52-MariaDB MariaDB Server
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> quit
Bye
06.mysqld与mysqld_safe
--mysqld_safe是启动命令;
--mysqld启动服务;
--systemctl cat mariadb.service
[root@vm1 ~]# which mysqld_safe
/usr/bin/mysqld_safe
[root@vm1 ~]# cat /etc/my.cnf|grep -v "^#"
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
################
启动数据库--
# systemctl start maiadb
--直接使用mysqld_safe来启动mysql数据库
-方法1:使用配置文件
# /usr/bin/mysqld_safe --defaults-file=/etc/my.cnf &
方法2:直接使用命令
# /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mariadb/mysqld.pid --basedir=/usr --user=mysql &
## 启动命令 数据库目录 socket pid basedir user 后台运行符
basedir 参数
--该参数指定了安装 MySQL 的安装路径,填写全路径可以解决相对路径所造成的问题
例如:
basedir="E:/dev/MySQL/MySQL Server 5.2/"
则表示我的 MySQL 安装在 E:/dev/MySQL/MySQL Server 5.2/ 路径下
datadir 参数
--该参数指定了 MySQL 的数据库文件放在什么路径下。数据库文件即我们常说的 MySQL data 文件。
例如:
datadir="E:/dev/MySQL/MySQL Server 5.2/Data/"
则表示我的 MySQL 数据库文件放在 E:/dev/MySQL/MySQL Server 5.2/Data/ 路径下。
关闭数据库--
停掉这个数据库可以
# /usr/bin/mysqladmin shutdown
# /usr/bin/mysqladmin shutdown -p123
停也可以直接用杀进程
# kill -15 `cat /var/run/mysqld/mysqld.pid`
# kill -9 `cat /var/run/mysqld/mysqld.pid`
07.三种修改mysql数据库密码方法及忘记密码如何修改
修改密码三种方法:
(修改的用户为 root@localhost)
第一种:不用刷新缓存表
mysqladmin -u password
mysqladmin -u -p password
# mysqladmin -uroot password "123" --把root用户登录密码改为123
# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
登录测试--
# mysql -p123 --参数与密码之间没有空格
# mysql -p --不想明文登录就使用这种方式
Enter password:
登录测试--
# mysqladmin -uroot password '456' -p123 --有密码后,再使用这个命令改密码,就需要原密码
--456 新密码
--p 原密码
# mysqladmin -uroot password -p
Enter password: --隐藏输入原密码
New password: --隐藏输入新密码
Confirm new password: --隐藏确认新密码
第二种:需要刷新权限表,忘记只能使用这种方法
不加密存储
MariaDB [(none)]> update mysql.user set password=789;
MariaDB [(none)]> update mysql.user set password=789 where user="root" and host="localhost";
加密存储
MariaDB [(none)]> update mysql.user set password=password("789") where user="root" and host="localhost";
--使用sql语句在数据库内部直接修改用户密码表,password()是一个密码加密函数
-- update 数据库.表格 set password=password("") where 条件 and 条件;
mysql> flush privileges; --修改过密码后都要记得刷新权限表
第三种:不需要刷新权限表
MariaDB [(none)]> set password for 'root'@'localhost'=password('123');
--使用此操作语句也可以修改密码,修改后不需要刷新权限表; password()是一个密码加密函数
-- set password for 条件=password("");
-- set password for ""@""=password("");
忘记密码如何修改
1,可以在(--默认的主配置是/etc/my.cnf)配置文件里加上
skip-grant-tables --注意写到[mysqld]参数组下,表示跳过授权
2,systemctl restart mariadb
# mysql --登录就不需要密码,进去改密码,改完后,直接flush privileges就可以使用新密码来登录了
3,改完后记得去掉skip-grant-tables ,然后重新 restart 数据库进程
systemctl restart mariadb
4,再使用新的密码登录
08.mysql优化-清空多余的用户、清空多余的库
清空多余在用户
备注--[查询一个库下有什么表可以用]
查询系统所有库和表名字--
select TABLE_SCHEMA,TABLE_NAME from information_schema.tables;
查询information_schema库下的所有表--
select TABLE_SCHEMA,TABLE_NAME from information_schema.tables where TABLE_SCHEMA="information_schema";
MariaDB [(none)]> select user,host,password from mysql.user;
--另外几个用户不安全,所以下面把它们都删除掉
MariaDB [(none)]> delete from mysql.user where password="";
删除空密码账户
--delete from 表 where 条件1 and 条件2;
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> select user,host,password from mysql.user;
清空多余的库
[root@vm1 mysql]# ps aux|grep mysql|grep -v grep
mysql 25298 0.0 0.1 113256 1580 ? Ss 00:44 0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql 25456 0.0 9.2 904804 92796 ? Sl 00:44 0:01 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
[root@vm1 ~]# ll /var/lib/mysql
total 28700
-rw-rw---- 1 mysql mysql 16384 May 1 00:43 aria_log.00000001
-rw-rw---- 1 mysql mysql 52 May 1 00:43 aria_log_control
-rw-rw---- 1 mysql mysql 18874368 May 1 00:43 ibdata1
-rw-rw---- 1 mysql mysql 5242880 May 1 00:44 ib_logfile0
-rw-rw---- 1 mysql mysql 5242880 Apr 30 16:02 ib_logfile1
drwx------ 2 mysql mysql 4096 Apr 30 16:02 mysql
srwxrwxrwx 1 mysql mysql 0 May 1 00:44 mysql.sock
drwx------ 2 mysql mysql 4096 Apr 30 16:02 performance_schema
drwx------ 2 mysql mysql 6 Apr 30 16:02 test
[root@vm1 ~]# ll /var/lib/mysql/test/
total 0
[root@vm1 ~]# mysql
MariaDB [(none)]> drop database test; --test库是测试用的,可以删除
Query OK, 0 rows affected (0.02 sec)
MariaDB [(none)]> show databases;
09.mysql优化-修改mysql默认参数或者查看mysql运行状态
查看mysql运行状态
mysql> show variables; --查看mysql的当前参数和对应的值
mysql> show status; --查看mysql运行的各个状态参数
命令行执行mysql命令
# mysqladmin -uroot -p123456 status |head
Uptime: 483 Threads: 2 Questions: 25 Slow queries: 0 Opens: 0 Flush tables: 2 Open tables: 26 Queries per second avg: 0.051
# mysqladmin -uroot -p123456 extended-status |head
# mysql -uroot -p123456 -e "show status"
# mysql -e "use information_schema; show tables"
修改mysql默认参数
1.临时修改默认参数--
MariaDB [(none)]> show variables like '%max_connections%'; --模糊查询mysql连接数
MariaDB [mysql]> show processlist; --查看当前有哪些连接
MariaDB [mysql]> set max_connections=200;
ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL
MariaDB [mysql]> set global max_connections=200;
Query OK, 0 rows affected (0.00 sec)
MariaDB [mysql]> show variables like '%max_connections%';
--但注意上面的修改重启又回变回到151
2.永久修改默认参数--
# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
max_connections=200 --把要修改的参数写到[mysqld]下(注意此参数写到[mysqld_safe]下是不能生效的)
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
# systemctl restart mariadb
MariaDB [(none)]> show variables like '%max_connections%';
所有连接缓冲-每个连接缓冲
read_buffer_size 每个线程顺序读区分配的缓冲区大小
read_rnd_buffer_size 随机读(查询操作)缓冲区大小
sort_buffer_size 重建索引时允许使用的临时文件大小
thread_stack 每个线程的堆栈大小
net_buffer_length 网络缓冲区的大小
join_buffer_size 表间关联缓存的大小
binlog_cache_size 二进制日志缓冲大小
服务器缓冲
key_buffer_size 用于缓存MyISAM表的索引块
tmp_table_size MySQL的临时表缓冲大小
query_cache_size 查询缓存大小,用于缓存SELECT查询结果
服务器缓冲-InnoDB存储引擎
innodb_buffer_pool_size InnoDB使用缓冲池大小
innodb_log_buffer_size InnoDB日志数据缓冲大小
服务器缓冲-表缓存
table_open_cache 表的文件描述符缓存数量
table_definition_cache 表的结构定义缓存数量
10.源码版编译mysql5.6
三种版本安装的比较:
rpm : 安装方便,功能已经定制好。对于特别大量的环境做批量安装比较方便。
二进制: 安装比较方便,功能也是已经定制好,但有所选择。其实就是省去编译步骤的源码版
源码版: 安装过程比较麻烦,要求技术水平高,但能自己去定制需要的功能,生产环境下有功能需求的话尽量使用这种版本
安装mysql-5.6.25的源码版
下载路径为:
http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.25.tar.gz/from/http://mysql.mirror.rafal.ca/
MySQL5.5版本之后,编译的选项同样众多,DBA可以通过# cmake . -LH 查看支持的参数,或者浏览下列页面:http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html,查看编译时可指定参数的详细描述。
一些常用参数如下:
* CMAKE_INSTALL_PREFIX:指定MySQL程序的安装目录,默认/usr/local/mysql
* DEFAULT_CHARSET:指定服务器默认字符集,默认latin1
* DEFAULT_COLLATION:指定服务器默认的校对规则,默认latin1_general_ci
* ENABLED_LOCAL_INFILE:指定是否允许本地执行LOAD DATA INFILE,默认OFF
* WITH_COMMENT:指定编译备注信息
* WITH_xxx_STORAGE_ENGINE:指定静态编译到mysql的存储引擎,MyISAM,MERGE,MEMBER以及CSV四种引擎默认即被编译至服务器,不需要特别指定。
* WITHOUT_xxx_STORAGE_ENGINE:指定不编译的存储引擎
* SYSCONFDIR:初始化参数文件目录
* MYSQL_DATADIR:数据文件目录
* MYSQL_TCP_PORT:服务端口号,默认3306
* MYSQL_UNIX_ADDR:socket文件路径,默认/tmp/mysql.sock
把你的机器上已经被人安装过的源码mysql给删除掉
# rm /usr/local/mysql -rf --删除安装目录(大部分的安装文件,命令,配置文件都放在这)
# rm /mysqldata56/ -rf --删除定义的数据目录(此目录是自定义的)
# rm /usr/src/mysql-* -rf --删除以前编译过mysql的源码
安装前准备:
# yum -y install gcc gcc-c++ cmake openssl-devel ncurses-devel wget curl lrzsz
--确认安装常见依赖包
# yum -y groupinstall "Base" "Compatibility Libraries" "Development tools"
--确认安装常见依赖包
# useradd mysql -s /sbin/nologin
# tar xf mysql-5.6.25.tar.gz -C /usr/src/
# cd /usr/src/mysql-5.6.25/
# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=gbk,gb2312 -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_SSL=system -DWITH_EMBEDDED_SERVER=1
格式也可以是这样的
cmake .
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
-DWITH_EXTRA_CHARSETS=all
-DENABLED_LOCAL_INFILE=1
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_SSL=system
-DWITH_EMBEDDED_SERVER=1
-DCMAKE_INSTALL_PREFIX= 安装根目录
-DCMAKE_INSTALL_PREFIX= unix套接字目录
-DDEFAULT_CHARSET= 默认字符集
-DWITH_EXTRA_CHARSETS= 额外的编码,请使用ALL来编译
-DDEFAULT_COLLATION=默认编码 设定默认排序规则
-DWITH_MYISAM_STORAGE_ENGINE=1 编译myisam存储引擎,默认的存储引擎,不加也可以
-DWITH_INNOBASE_STORAGE_ENGINE=1 支持InnoDB存储引擎,这个也是默认安装的
-DWITH_READLINE=1 使用readline功能
-DENABLED_LOCAL_INFILE=1 可以使用load data infile命令从本地导入文件
-DMYSQL_DATADIR=数据库 数据目录
-DWITH_SSL=system 启用ssl库支持(安全套接层)
-DWITH_EMBEDDED_SERVER=1 将编译Embedded Mysql库(编译嵌入式服务器支持)
# make -j 2
或者 make
# make install
# ll /usr/local/mysql/support-files/
--服务脚本模版
# cat -n /etc/init.d/mysql.server |grep =$
46 basedir=
47 datadir=
63 mysqld_pid_file_path=
86 datadir_set=
216 print_defaults=
安装后
1,手动编写my.cnf配置文件
# vim /usr/local/mysql/my.cnf
[mysqld]
port=3306
datadir=/usr/local/mysql/data
pid-file=/usr/local/mysql/data/mysql.pid
socket=/usr/local/mysql/data/mysql.socket
socket=/tmp/mysql.sock
log-error=/usr/local/mysql/data/mysql-err.log
log-bin=binlog
max_connections=2000
user=mysql
[client]
socket=/usr/local/mysql/data/mysql.socket #--client参数组里这个参数表示,客户端连接时,自动加此参数
2:创建相关目录,并修改权限
# mkdir /usr/local/mysql/data -p
# chown mysql.mysql /usr/local/mysql -R
# chmod g+s /usr/local/mysql
# chmod 770 /usr/local/mysql
3:初始化数据库
# /usr/local/mysql/scripts/mysql_install_db --defaults-file=/usr/local/mysql/my.cnf --basedir=/usr/local/mysql/
# ll /usr/local/mysql/scripts/mysql_install_db
-rwxr-xr-x 1 mysql mysql 34558 May 1 15:13 /usr/local/mysql/scripts/mysql_install_db
# /usr/local/mysql/scripts/mysql_install_db --defaults-file=/usr/local/mysql/etc/my.cnf --basedir=/usr/local/mysql/
FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
Data::Dumper
( yum -y install autoconf )
( yum install perl-Data-Dumper -y )
[root@vm2 mysql-5.6.25]# rm /etc/my.cnf
4:启动服务
# /usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/etc/my.cnf &
--这样启动mysql不能实现开机自动启动(解决方法:1,自己写服务脚本 2,写到/etc/rc.local里)
5:登录
# echo 'export PATH=$PATH:/usr/local/mysql/bin' > /etc/profile.d/mysql.sh
# . /etc/profile.d/mysql.sh
或者
# vim /etc/profile
export PATH=$PATH:/usr/local/mysql/bin/
# source /etc/profile
# /usr/local/mysql/bin/mysql
登录命令太长:可以做软链接或别名 ,或直接把此命令拷到/bin/下换个名字(因为rpm版也有mysql命令,防止冲突)
如果服务启不来:
排错思路:先细心对比一下过程(参数是否写错),看下是否进程已经存在(已经启动了)。如果还查不出来,可以尝试查看错误日志里的报错,根据报错再来排错
6.关闭数据库
# /usr/local/mysql/bin/mysqladmin shutdown
7.1采用系统的启动脚本
[root@vm1 ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
指定my.cnf在系统自带脚本位置的相关做法--
1.修改 /usr/local/mysql/support-files/mysql.server
bindir/mysqld_safe --datadir="\(datadir" --pid-file="\)mysqld_pid_file_path" \(other_args >/dev/null 2>&1 &
修改为,
\)bindir/mysqld_safe --defaults-file="\(conf" --datadir="\)datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
2.不修改 /usr/local/mysql/support-files/mysql.server 任何内容,但把 my.cnf放到 软件安装目录(/usr/local/mysql) 或者 /etc 下
当/usr/local/mysql/my/cnf 是存在并且正确的,但是/etc/my.cnf是存在但配置错误的,脚本启动还是会报错,报错如下"The server quit without updating PID file"
凡是出现报错“The server quit without updating PID file”,统一视为 my.cnf出现故障,故障有2类,1是文件不存在,2是文件存在但是有问题
总结--
1.原来mysql自带的脚本 如果安装的路径是/usr/local/mysql的话,基本路径和数据路径不用改变,指定下my.cnf 和 pid文件就可以
2.mysql脚本的默认软件安装路径是/usr/local/mysql,下述的mysql是存在2个默认my.cnf启动路径的,最高优先级 是 软件安装目录 /usr/local/mysql/my/cnf, 当 软件安装目录不存在my.cnf的时候,则会默认启动 /etc/my.cnf
安装 报“The server quit without updating PID file”错误 配置--
[root@vm1 ~]# /etc/init.d/mysqld start
Starting MySQL. ERROR! The server quit without updating PID file (/usr/local/mysql/data/mysql.pid).
说明:my.cnf文件故障
7.2 自写的启动脚本
# vim /etc/init.d/mysql
#!/bin/bash
# chkconfig: 2345 64 36
start() {
/usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/etc/my.cnf &
}
stop() {
kill -15 `cat /usr/local/mysql/data/mysql.pid`
}
status() {
netstat -nltup|grep mysqld
}
case "$1" in
start )
start ;;
stop )
stop ;;
restart )
stop
start
;;
status )
status ;;
* )
echo "只支持(start|stop|restart)"
esac
11.安装mysql5.7-基于二进制方式
https://www.cnblogs.com/linuxshare/p/16798500.html
12.mysql错误代码大全
130 :文件格式不正确。
145 :文件无法打开
1005:创建表失败
1006:创建数据库失败
1007:数据库已存在,创建数据库失败
1008:数据库不存在,删除数据库失败
1009:不能删除数据库文件导致删除数据库失败
1010:不能删除数据目录导致删除数据库失败
1011:删除数据库文件失败
1012:不能读取系统表中的记录
1020:记录已被其他用户修改
1021:硬盘剩余空间不足,请加大硬盘可用空间
1022:关键字重复,更改记录失败
1023:关闭时发生错误
1024:读文件错误
1025:更改名字时发生错误
1026:写文件错误
1032:记录不存在
1036:数据表是只读的,不能对它进行修改
1037:系统内存不足,请重启数据库或重启服务器
1038:用于排序的内存不足,请增大排序缓冲区
1040:已到达数据库的最大连接数,请加大数据库可用连接数
1041:系统内存不足
1042:无效的主机名
1043:无效连接
1044:当前用户没有访问数据库的权限
1045:不能连接数据库,用户名或密码错误
1048:字段不能为空
1049:数据库不存在
1050:数据表已存在
1051:数据表不存在
1054:字段不存在
1065:无效的SQL语句,SQL语句为空
1081:不能建立Socket连接
1114:数据表已满,不能容纳任何记录
1116:打开的数据表太多
1129:数据库出现异常,请重启数据库
1130:连接数据库失败,没有连接数据库的权限
1133:数据库用户不存在
1141:当前用户无权访问数据库
1142:当前用户无权访问数据表
1143:当前用户无权访问数据表中的字段
1146:数据表不存在
1147:未定义用户对数据表的访问权限
1149:SQL语句语法错误
1158:网络错误,出现读错误,请检查网络连接状况
1159:网络错误,读超时,请检查网络连接状况
1160:网络错误,出现写错误,请检查网络连接状况
1161:网络错误,写超时,请检查网络连接状况
1062:字段值重复,入库失败
1169:字段值重复,更新记录失败
1177:打开数据表失败
1180:提交事务失败
1181:回滚事务失败
1203:当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接数或重启数据库
1205:加锁超时
1211:当前用户没有创建用户的权限
1216:外键约束检查失败,更新子表记录失败
1217:外键约束检查失败,删除或修改主表记录失败
1226:当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器
1227:权限不足,您无权进行此操作
1235:MySQL版本过低,不具有本功能
1250:客户端不支持服务器要求的认证协议,请考虑升级客户端。
1251:Client 不能支持 authentication protocol 的要求Client does not support authentication protocol requested by server; consider upgrading MySQL clientQuote:
1267:不合法的混合字符集。
2002:服务器端口不对。
2003:MySQL 服务没有启动,请启动该服务。
2008:MySQL client ran out of memory错误指向了MySQL客户mysql。这个错误的原因很简单,客户没有足够的内存存储全部结果。
2013:远程连接数据库是有时会有这个问题,MySQL 服务器在执行一条 SQL 语句的时候失去了连接造成的。
mysql-2 体系结构、引擎、物理文件、帮助、sql
01.mysql系统体系结构
--
mysql系统体系结构:
SQL 结构化查询语言
逻辑模块组成
总的来说,mysql可以看成是两层架构--
第一层我们通常叫做sql layer,在mysql数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,query cache的处理,query解析,执行计划优化等;
第二层为存储引擎层,控制底层的数据存取。
DQL(data query language) 数据查询语言 select
DDL(data define language) 数据定义语言 create drop alter truncate rename
DML(data manipulate language) 数据操纵语言 insert update delete
DCL(data control language) 数据控制语言 grant revoke
缓存:
客户端浏览器(缓存)--》正向代理(缓存)--internet--网站反向代理或者CDN(缓存)--网站(apache有缓存模块,php也有缓存加速器)--memcache/redis--数据库(mysql本身也有query cache)--存储(缓存)
02.mysql存储引擎简介
1.mysql存储引擎简介
--mysql存储引擎简介
1.MyISAM
2.innoDB
3.ndb cluster
4.merge
5.Memory
6.BDB
7.federated
8.archive
9.blackhole
10.CSV
(发动机,空调的模式)
1、MyISAM --mysql5.5版本前的默认引擎
mysql5.5版本之前默认的存储引擎,也是目前使用非常广泛的存储引擎之一,是ISAM的升级版本。
(用于读多写少的环境)
2、innoDB存储引擎简介 --学了oracle后比较好理解
除了MyISAM外,使用最为广泛的存储引擎,由第三方公司开发,和mysql遵守相同的开源许可协议。
支持事务安全
数据多版本读取
锁定机制的改进
实现外键
它有表空间的概念,但与oracle表空间相比又有较大的不同,首先,innodb的表空间分为两种形式,一种是共享表空间,也就是所有数据都被存放在同一个表空间(一个或多个数据文件)中,通过innodb_data_file_path来指定,增加数据文件须要停机重启。另外一种是独享表空间,也就是每个表的数据和索引都存放在一个单独的.ibd文件中。
3、NDB cluster存储引擎简介
主要用于mysql cluster分布式集群环境。简单地说,mysql cluster就是在无共享存储设备的情况下实现的一种内存数据库cluster环境,主要是通过NDB cluster (简称NDB)存储引擎来实现的。
其他存储引擎介绍
4、merge
可以简单地理解其功能就是结构相同的MyISAM表通过一些特殊的包装对外提供一个单一的访问入口,从而减小应用复杂度的目的。
要创建merge表,不仅基表的结构要完全一致,包括字段的顺序,基表的索引也必须完全一致
merge表本身并不存储数据,仅仅是多个基表提供一个统一的存储入口。所以在创建merge表的时候,mysql只会生成两个较小的文件,一个是.frm的结构定义文件,还有一个.MRG文件,用于存放参与MERGE表的名称(包括所属数据库schema)
5、Memory存储引擎
它是一个将数据存储在内存中的存储引擎。
memory存储引擎不会将任何数据存放到磁盘上,在磁盘上仅仅存放了一个表结构相关信息的.frm文件。所以一旦mysql崩溃或主机崩溃之后,memory的表就只剩下一个结构了。
它实现的是页级锁定XAMP
此引擎所有数据都存放在内存中,那么它消耗的内存量可想而知。
6、BDB存储引擎
BDB存储引擎全称为berkeleyDB存储引擎,和innoDB一样,也是第三方的,同样支持事务安全。
在锁定机制方面,和memory存储引擎一样,实现页级锁定。
7、federated存储引擎
它所实现的功能和oracle的DBLINK基本相似,主要是用来提供对远程mysql服务器上面的数据的访问接口,如果我们使用源码编译来安装mysql,那么必須手工指定启用federated存储引擎,因为mysql默认是不启用该存储引擎的。
8、archive存储引擎
主要用于通过较小的存储空间来存放过期的很少访问的历史数据。archive表不支持索引,包含一个.frm的结构定义文件,一个.ARZ的数据压缩文件,还有一个.ARM的元数据
信息文件。由于其所存放的数据的特殊性,archive表不支持删除,修尽管操作,仅支持插入和查询操作。
锁定机制为行级锁定。
9、blackhole存储引擎
就是一个‘黑洞’,就像/dev/null设备一样,不管写入任何信息,都是有去无回。
比如数据迁移过程,数据要经过一个中转的mysql服务器做一些相关的转换操作,然后再通过复制移植到新的服务器上面。如果中转服务器没有足够的空间,可以用blackhole引擎,它不记录任何数据(这样就不会占用空间了),但是会在binary log中记录下所有的query,把这些记录复制应用到新的服务器上。
10、CSV存储引擎
操作的就是一个标准的CSV文件,它不支持索引,主要用途就是有时候可能要通过数据库导出一份报表文件,而CSV文件是很多软件都支持的一种标准格式,所以可以先在数据库中建立一张CVS表,然后将生成的报表信息插入该表,就能得到一份CSV报表文件了
===
2.存储引擎相关的操作
1.存储引擎相关的操作
2.查询数据库里所有的表及其对应的engine (表才有引擎)
3.验证memory存储引擎的功能
1.存储引擎相关的操作:
mysql> show engines;
default表示默认引擎
YES表示启用的引擎
no表示禁止的引擎
--如何 把disable改为yes,把yes改为disable
如:把ndbcluster改为yes,innodb改为disable,并把ndbcluster改为默认引擎
# vim /etc/my.conf --修改配置文件在[mysqld]参数组下加上下面两句
federated --启用federated (这里要小写)
skip-blackhole --禁用blackhole
default-storage-engine=myisam --默认引擎改为myisam
# systemcl restart mariadb --重启验证
修改前
修改后
============
2.查询数据库里所有的表及其对应的engine (表才有引擎)
mysql> desc information_schema.TABLES;
mysql> select table_name,engine from information_schema.tables;
mysql> select table_schema,table_name,engine from information_schema.tables;
mysql> select table_schema,table_name,engine from information_schema.tables where table_schema="mysql";
mysql> select table_schema,table_name,engine from information_schema.tables where table_schema="mysql" and table_name="user";
查询系统所有库和表名字--
select TABLE_SCHEMA,TABLE_NAME from information_schema.tables ;
查询information_schema库下的所有表--
select TABLE_SCHEMA,TABLE_NAME from information_schema.tables where TABLE_SCHEMA="information_schema";
############
MariaDB [(none)]> use information_schema
MariaDB [information_schema]> show tables;
mysql> select TABLE_SCHEMA,TABLE_NAME,ENGINE from information_schema.tables where TABLE_SCHEMA="mysql";
mysql> select TABLE_SCHEMA,TABLE_NAME,ENGINE from information_schema.TABLES where TABLE_SCHEMA='mysql' and TABLE_NAME='user';
============
3.验证memory存储引擎的功能
mysql> create database aaa; --或者create schema aaa;
mysql> use aaa;
mysql> create table aaa (id int) engine=memory; --如果不指定engine=memory则使用默认引擎
mysql> show create table aaa; --查看创建这个表的语句
mysql> insert into aaa values(1);
mysql> insert into aaa values(2);
mysql> select * from aaa;
mysql > select table_schema,table_name,engine from information_schema.tables where table_schema="aaa" and table_name="aaa";
mysql> create table bbb (id int); --使用默认引擎
mysql> show create table bbb; --查看创建这个表的语句
mysql> insert into bbb values(1);
mysql> insert into bbb values(2);
mysql> select * from bbb;
mysql > select table_schema,table_name,engine from information_schema.tables where table_schema="aaa" and table_name="bbb";
mysql > select TABLE_SCHEMA,TABLE_NAME,ENGINE from information_schema.tables where TABLE_SCHEMA="aaa";
查询创建的表的列字典,引擎以及表的字符集
mysql> show create table aaa.aaa;
mysql> show create table aaa.bbb;
除了create表时可以指定引擎,还可以对已经create的表修改引擎
alter table aaa engine=innodb; --把aaa表改成innodb的存储引擎
alter table aaa.aaa engine=innodb; --把aaa库aaa表改成innodb的存储引擎
alter table aaa.bbb engine=MEMORY; --把aaa库bbb表改成MEMORY的存储引擎
# systemcl restart mariadb
# mysql
mysql> select * from aaa.aaa; --发现没有数据了
mysql> select * from aaa.bbb; --发现数据还在
03.mysql物理文件组成
mysql物理文件组成
( 日志文件,数据文件,配置文件,pid文件,socket文件等 )
日志文件
日志文件
--查询系统所有日志
mysql> show variables like "%log%";
1、错误日志 error log
记录了运行过程中所有较为严重的警告和错误信息,以及mysql server每次启动和关闭的详细信息。
在默认情况下,系统记录错误日志的功能是关闭的,错误信息被输出到标准错误输出(stderr),如果要开启系统记录错误日志的功能,须要在启动时开启--log-error选项
error log默认存放在数据目录(datadir)下,以hostname.err命名。
但是可以使用命令:--log-error[=file_name]修改其存放目录和文件名
# vim /etc/my.cnf
[mysqld]
log-error=/usr/local/mysql/data/mysql-err.log
mysql> show variables like 'log_error'; --在数据里这样查看你的错误日志
+---------------+------------------------------+
| Variable_name | Value |
+---------------+------------------------------+
| log_error |/usr/local/mysql/data/mysql-err.log |
+---------------+------------------------------+
# mysql -e 'show variables like "log_error"
例:把你的系统时间使用date -s 20390101改成2038年之后,启动mysql会启不来,通过查看错误日志可以看到如下报错
2039-01-01 00:00:41 0 [ERROR] This MySQL server doesn't support dates later then 2038
2039-01-01 00:00:41 0 [ERROR] Aborting
解决: 改对时间,再启动mysql
2、查询日志:query log
查询日志记录mysql中所有的操作,可通过
general_log
general_log_file=/var/lib/mysql/query.log
可以打开此查询日志。
由于记录了所有的SQL操作,包括所有的select,体积比较大,开启后对性能也有较大的影响,所以请大家慎用此功能。一般只在跟踪一些特殊的query性能问题时才会短暂打开此功能。
默认的查询日志文件名为hostname.log
使用SQL查询慢查询日志
mysql -uroot -p00 -h10.10.236.13 -e 'select db,query_time,lock_time,start_time,sql_text from mysql.slow_log where start_time between "2019-09-18 08:00:00" and "2019-09-19 10:00:00" order by query_time desc'
mysql> show variables like "general_log";
mysql> show variables like "%general_log%";
# vim /etc/my.cnf --加上上面的两个参数在[mysqld]参数组下,然后重启服务生效
[mysqld]
general_log
general_log_file=/var/lib/mysql/query.log
# mkdir -p /var/lib/mysql
# chown mysql.mysql /var/lib/mysql
# chmod 770 /var/lib/mysql
# chmod g+s /var/lib/mysql
# systemctl restart mariadb
# cat /var/lib/mysql/query.log --会记录所有的操作(包括登录,查询,增删改所有操作)
\3、二进制日志: binary log& binary log index(类似oracle里的redo日志)
在通过"--log-bin[=file_name]"打开记录的功能之后,mysql会将所有修改数据库数据的query以二进制形式记录到日志文件中,还包括每一条query所执行的时间,所消耗的资源,以及相关的事务信息,所以binlog是事务安全的
mysql> show variables like 'log_bin';
打开方法在配置文件里加上类似下面一句,重启mysql服务
log-bin=binlog --binlog为自定义的名字
# vim /etc/my.cnf --加上上面的参数在[mysqld]参数组下,然后重启服务生效
[mysqld]
log-bin=binlog
# systemctl restart mariadb
mysql> show master logs; 查看系统当前的二进制日志
查看方法:不能用cat,要使用mysqlbinlog命令来看(日志在数据存储目录下-datadir下面)
# mysqlbinlog /var/lib/mysql/binlog.000001
MariaDB [(none)]> create database abc;
MariaDB [(none)]> use abc;
MariaDB [abc]> create table abc(id int);
MariaDB [abc]> insert into abc values(1);
MariaDB [abc]> insert into abc values(2);
MariaDB [abc]> insert into abc values(3);
--下面这一段是记录了创建abc库,并创建abc表,并插入1-3三条数据的所有二进制日志记录
# at 605
#180104 11:39:02 server id 1 end_log_pos 686 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1515037142/*!*/;
create database abc
/*!*/;
# at 686
#180104 11:39:13 server id 1 end_log_pos 772 Query thread_id=2 exec_time=0 error_code=0
use `abc`/*!*/;
SET TIMESTAMP=1515037153/*!*/;
create table abc(id int)
/*!*/;
# at 772
#180104 11:39:18 server id 1 end_log_pos 839 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1515037158/*!*/;
BEGIN
/*!*/;
# at 839
#180104 11:39:18 server id 1 end_log_pos 926 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1515037158/*!*/;
insert into abc values(1)
/*!*/;
# at 926
#180104 11:39:18 server id 1 end_log_pos 953 Xid = 13
COMMIT/*!*/;
# at 953
#180104 11:39:21 server id 1 end_log_pos 1020 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1515037161/*!*/;
BEGIN
/*!*/;
# at 1020
#180104 11:39:21 server id 1 end_log_pos 1107 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1515037161/*!*/;
insert into abc values(2)
/*!*/;
# at 1107
#180104 11:39:21 server id 1 end_log_pos 1134 Xid = 14
COMMIT/*!*/;
# at 1134
#180104 11:39:22 server id 1 end_log_pos 1201 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1515037162/*!*/;
BEGIN
/*!*/;
# at 1201
#180104 11:39:22 server id 1 end_log_pos 1288 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1515037162/*!*/;
insert into abc values(3)
/*!*/;
# at 1288
COMMIT/*!*/;
# at 1315
假设做了一个误操作drop table abc;怎么恢复数据--
恢复方法一: ()
# mysqlbinlog --start-position=686 --stop-position=1315 /var/lib/mysql/binlog.000001 | mysql -p123
--start-position=开始语句的第一条
--stop-position=COMMIT(提交)的下一条的at
恢复方法二:
# mysqlbinlog /var/lib/mysql/binlog.000001 |grep abc |awk 'NR>1 {print $0}' |tac |awk 'NR>1 {print $0";"}' |tac |mysql -p123
--这里只是演示一个例子,不具备通用性(这种做法也有很多问题,如果数据库跑了多年,你还要先合并日志,但日志太多,也不好做处理)
[root@vm2 ~]# mysqlbinlog /usr/local/mysql/data/binlog.000001 |grep abc |awk 'NR>1 {print $0}' |tac |awk 'NR>1 {print $0";"}' |tac
use abc
/!/;;
create table abc(id int);
insert into abc values(1);
insert into abc values(2);
insert into abc values(3);
4、慢查询日志:slow query log
此日志中记录的是执行时间较长的query,也就是常说的slow query,通过设--log-slow-queries[=file_name]来打开此功能并设置记录位置和文件名,默认文件名为hostname-slow.log,默认目录也是数据目录。
慢查询日志采用的是简单的文本格式,可以通过各种文件编辑器查看其中的内容。其中记录了语句执行的时刻,执行所消耗的时间,执行用户,连接主机等相关信息。
mysql还提供了专门用来分析慢查询日志的工具程序mysqlslowdump,以帮助数据库管理人员解决可能存在的性能问题。
mysql> show variables like "%slow_query_log%";
# vim /etc/my.cnf --加上上面的参数在[mysqld]参数组下,然后重启服务生效
[mysqld]
slow_query_log
#slow_query_log_file=slow.log
# systemctl restart mariadb
查询指定时间段的慢查询日志
mysql -u{用户} -p{密码} -h{主机ip} -e 'select db,query_time,lock_time,start_time,sql_text from mysql.slow_log where start_time between "2019-09-18 08:00:00" and "2019-09-19 10:00:00" order by query_time desc'
5、innoDB引擎的在线redo日志:innoDB redo log
innoDB是一个事务安全的存储引擎,其事务安全性主要是通过在线redo日志和记录在表空间的undo信息来保证的。
redo日志中记录了innoDB所做的所有物理变更和事务信息,通过redo日志和undo信息,innoDB保证了在任何情况下的事务安全性。
innoDB的redo日志同样默认存放在数据目录下,可以通过innodb_log_group_home_dir来更改设置日志的存放位置,通过innodb_log_files_in_group设置日志的数量。
mysql> show variables like "%innodb_log_files_in_group%";
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| innodb_log_files_in_group | 2 |
+---------------------------+-------+
1 row in set (0.00 sec)
mysql> show variables like "%innodb_log_group_home_dir%";
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| innodb_log_group_home_dir | ./ |
+---------------------------+-------+
[root@vm1 ~]# ll /usr/local/mysql/data/ib_logfile*
-rw-rw---- 1 mysql mysql 50331648 Jun 11 15:19 /usr/local/mysql/data/ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Jun 10 18:54 /usr/local/mysql/data/ib_logfile1
数据文件
数据文件
不同的存储引擎有各自不同的数据文件,存放位置也有区别。多数存储引擎的数据文件都存放在和myisam数据文件位置相同的目录下,但是每个数据文件的扩展名却各不一样。如myisam用“.MYD"为扩展名,innoDB用".ibd",archive用".arc",CSV用'.CSV',等等。
1、.frm 文件
不论是什么存储引擎,每一个表都会有一个以表名命名的.frm文件,与表相关的元数据(meta)信息都存放在此文件中,包括表结构的定义信息等。
所有的.frm文件都存放在所属数据库的文件夹下面。
(desc xx)
2、.MYD文件
myisam存储引擎专用,存放myisam表的数据(data)。
每一个myisam表都会有一个.MYD文件与之呼应,同样存放在所属数据库的文件夾下,和.frm文件在一起
create table a (id int) engine=myisam;
insert into a values(1);
insert into a select * from a;
......
插入几百W行记录,就会发现.MYD很大了
create table b (id int) engine=innodb;
insert into b values (2);
insert into b select * from b; --查询b表的数据然后插入b表中
......
插入几百W行记录后,就会发现/var/lib/mysql/ibdata1由10M变得很大了
3、.MYI文件
也是myisam存储引擎专用,存放myisam表的索引相关信息。
对于myisam存储引擎来说,可以被缓存(cache)的内容主要就是来源于.MYI文件中。每一个myisam表对应一个.MYI文件,其存放的位置和.frm及.MYD一样
索引(index)的特点:加快查询速度,减慢写的速度。(优化有关)
4、.ibd文件和ibdata文件
存放innoDB的数据文件(包括索引)。
innoDB存储引擎有两种表空间方式:独享表空间和共享表空间。
独享表空间存储方式使用.ibd文件来存放数据,且每个表一个.ibd文件,文件存放在和myisam数据相同的位置。 (/usr/local/mysql/data/aaa/aaa.ibd)
共享存储表空间使用.ibdata文件,所有表共同使用一个(或多个,自行配置)ibdata文件。(/usr/local/mysql/data/ibdata1)
# vim /etc/my.cnf --加上上面的两个参数在[mysqld]参数组下,然后重启服务生效
[mysqld]
innodb_file_per_table=1 --把这个参数加到[mysqld]参数组,重启服务,就是独享表空间方式
mysql> show variables like "innodb_file_per_table";
临时修改--
mysql> show variables like "innodb_file_per_table";
mysql> set innodb_file_per_table=on;
ERROR 1229 (HY000): Variable 'innodb_file_per_table' is a GLOBAL variable and should be set with SET GLOBAL
mysql> set GLOBAL innodb_file_per_table=on;
5、db.opt --此文件在每一个自建的库里都会有,记录这个库的默认使用的字符集和校验规则
常见字符集:
gb18030
gb2312
gbk
utf-8
总结:
1.MySQL数据库是由N多表组成的,每个表有自己的表定义文件.frm文件,表索引文件,表数据文件。
INNODB的索引文件和数据文件是在一起的,MYISAM的索引文件和数据文件是分开的。
2.对于表空间,INNODB分成共享表空间和独享表空间2种。
共享的情况下,所有表的数据都存在一个文件里,
独享情况下,每个表单独文件存储此表的数据。
配置文件
AB复制(replication)相关文件
1、master.info
存在于slave端的数据目录下,里面存放了该slave的master端的相关信息,包括master的主机地址,连接用户,连接密码,连接端口,当前日志位置,已经读取到的日志位置等信息。
2、relay log 和relay log index
mysql-relay-bin.xxxxxn文件用于存放slave端的i/O线程从mater端所读取的binary log信息,然后由slave端的sql线程从该relay log中读取并解析相应的日志信息,转化成master所执行的query语句,接着在slave端应用。
mysql-relay-bin.index文件的功能类似于mysql-bin.index,同样是记录日志存放位置的绝对路径,只不过它所记录的不是binary log,而是relay log.
3、relay-log.info文件
类似于master.info,relay-log.info文件存放通过slave的i/O线程写入本地的relay log相关信息,以便slave端的SQL线程及一此管理操作随时能够获取当前复制的相关信息
其他文件 pid socket
1、系统配置文件
my.cnf,Unix/Linux默认存放在/etc目录下,windows环境一般存放在c:/windows目录下
此文件中可以包含多种参数选项组,每一种参数组都通过中括号给了固定的组名,如[mysqld]组中包括了mysqld服务启动时的初始化参数,[client]组中包含着客户端工具程序可以读取的参数,此外还有其他针对各个客户端软件的特定参数组,如mysql程序使用的[mysqld],mysqlchk使用的[mysqlchk],等
如果读者编写了某个客户端程序,也可以自己设定一个参数组名,将相关参数配置在里面,然后调用mysql客户端API程序中的参数读取API相关参数
2、pid文件
pid文件是mysqld应用程序在Unix/Linux环境下的一个进程文件,和许多其他Unix/Linux服务端程序一样,它存放着自己的进程id
就是一个文本文件,记录的程序的id
3、socket文件
socket文件也是在Unix/Linux环境下才有的,用户在Unix/Linux环境下客户端连接可以不通过TCP/IP网络而直接使用Unix Socket来连接mysql.
04.mysql数据库的帮助
mysql 数据库的帮助
1,官档
2,man 文档
3,命令行下的帮助文件
mysql > help;
mysql > help create table;
mysql> ? contents
--分了很多类
categories:
Account Management
Administration
Compound Statements
Data Definition
Data Manipulation
Data Types
Functions
Functions and Modifiers for Use with GROUP BY
Geographic Features
Help Metadata
Language Structure
Plugins
Procedures
Table Maintenance
Transactions
User-Defined Functions
Utility
mysql> ? Account Management --一级一级的向内部查
mysql> ? CREATE USER
05.sql语句
sql语句
结构化查询语言, structure query language,在不同数据库都是通用的,但会有少许不同
最早是由ANSI定义的标准 sql-86
DQL(data query language) 数据查询语言 select
DDL(data define language) 数据定义语言 create drop alter truncate rename
DML(data manipulate language) 数据操纵语言 insert update delete
DCL(data control language) 数据控制语言 grant revoke
第一部分:库有关的操作(建库,删除库,改库等)
mysql> create database aaa;
mysql> create schema aaa;
--创建一个叫aaa的库,也就是数据目录下创建了一个aaa的目录,owner为mysql.mysql,并在其内有一个db.opt的默认字符集文件
# ll /var/lib/mysql/aaa/
-rw-rw---- 1 mysql mysql 59 07-31 15:51 db.opt
手动在操作系统建库的过程
# mkdir /var/lib/mysql/bbb
--直接在datadir里建立一个bbb目录
# ll /var/lib/mysql
--但是看到权限不一样
total 86060
drwx------ 2 mysql mysql 4096 Jul 11 14:28 aaa
drwxr-xr-x 2 root root 4096 Jul 11 14:30 bbb
mysql> use bbb;
Database changed
mysql> create table bbb (id int);
--在数据库里操作,是不能建表的
ERROR 1005 (HY000): Can't create table 'bbb' (errno: 13)
# perror 13
--使用这个命令可以查访这个错误代码,告诉我们是权限拒绝错误
(这种错误代码还可能会出现在错误日志里,你可以使用这种方法排错)
OS error code 13: Permission denied
# chown mysql.mysql /var/lib/mysql/bbb/
# chmod 700 /var/lib/mysql/bbb/
--改owner,group,和权限
# cp -a /var/lib/mysql/aaa/db.opt /var/lib/mysql/bbb/
--再从别的库拷贝db.opt文件,并保留原属性
到此,手动建库完成
mysql> create database aaa character set=latin1;
--创建库的时候,指定非默认的字符集,库只有字符集这一个属性
mysql> alter database aaa character set=utf8;
--修改一个库的字符集
# vim /data/aaa/db.opt
--直接vim打开修改字符集,也可以(需要数据库重启)
mysql> show create database aaa
--可以用show查看创建库或者表的相关参数
mysql> create database if not exists aaa
--如果不存在则创建,如果存在,则有一个警告
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show warnings; --使用此命令可以查看上一句命令的警告,注意只能查看上一句
+-------+------+-------------------------------------------------+
| Level | Code | Message |
+-------+------+-------------------------------------------------+
| Note | 1007 | Can't create database 'aaa'; database exists |
mysql> drop database aaa;
--删除aaa库
--库改名的话没有相关命令,可以直接在系统上mv来修改
第二部分:表有关的操作(建表,删表,改表,加列,删列,改列的数据类型,列或表重命名等)
--创建表
mysql> create table emp (ename varchar(20),sex char(1),hiredate date,sal decimal(10,2),deptno tinyint(1));
mysql> create table emp
-> (ename varchar(20),
-> sex char(1),
-> hiredate date,
-> sal decimal(10,2),
-> deptno tinyint(1));
--可以分开写,比较容易阅读,但注意这只是一行
--表的其它操作
mysql> show create table emp;
--查看创建表的参数,引擎和默认的字符集
mysql> alter table emp engine=memory;
--修改表的引擎
mysql> alter table emp default charset=utf8;
--修改表的字符集
mysql> drop table emp;
删除表
mysql> rename table emp to emp1;
重命名表
mysql> create table emp ( ename varchar(20), sex char(1), hiredate date, sal decimal(10,2), deptno tinyint(1)) engine=memory default charset=utf8;
--也可以在创建表时直接指定非默认的引擎或字符集
mysql> alter table emp add empno int first;
--把一列加到最前面,使用first关键字
mysql> alter table emp add empno int;
--增加一个列,默认增加到最后
mysql> alter table emp add empno int after hiredate;
--在hiredate这列后面增加一列,使用after关键字
mysql> alter table emp drop empno;
--删除一列
mysql> alter table emp modify ename varchar(40);
--使用modify修改一列的数据类型
mysql> alter table emp change ename ename varchar(30);
--使用change修改一列的数据类型
mysql> alter table emp change ename name varchar(30);
----使用change修改一列的数据类型 和列名
--修改列名要使用change去修改
--modify和change的区别,都可以修改数据类型,但change要写原列名;只有change可以修改(或者说修改列名)列名,modify不可以
mysql> truncate table emp; --截断表,清空了表内的所有数据,但是表的结构还在
简述 drop,delete,truncate的区别?
drop: 属于DDL(在事务控制里,DDL语句不需要commit),他能删除对象(表,库)
truncate:属于DDL,清大量数据速度快,高水位线(high water mark)下降
delete:属于DML(在事务控制里,DML语句是需要commit,不提交的话可以rollback),高水位线不下降
通过上面的命令,把emp表多加三列,成为下面的格式
+-----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------+------+-----+---------+-------+
| empno | int(11) | YES | | NULL | |
| ename | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | tinyint(1) | YES | | NULL | |
| managerno | int(11) | YES | | NULL | |
+-----------+---------------+------+-----+---------+-------+
mysql> alter table emp add empno int first;
mysql> alter table emp add birthday date after sex;
mysql> alter table emp add managerno int;
第三部分:数据的插入和sql脚本导入方法
mysql> insert into aaa.emp values (1,'boss','m','1964-08-08','1995-01-01','20000','1','1')
--插入数据,注意在mysql里数字可以不用加引号,别的都加引号
mysql> insert into emp values
-> (1,'boss','m','1964-08-08','1995-01-01','20000','1','1'),
->(2,'zhangsan','m','1967-04-05','1995-04-11','15000','2','1');
Query OK, 2 rows affected, 0 warning (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0
--一次插入多条记录
还可以插入特定的列(非所有列),那么没有插入的就成了空值(空值不是0,它做任何运算结果还是空值)
mysql> insert into emp (ename,sex) values ('lisi','m');
mysql> truncate table emp;
--截断表,清空了表内的所有数据,但是表的结构还在
下面针对上面的新表结构,写成一个脚本,直接插入9列数据
也可以直接写成一行的脚本,使用mysql工具直接导入进去
# vim emp.sql
#!/bin/bash
insert into aaa.emp values (1,'boss','m','1964-08-08','1995-01-01','20000','1','1'),(2,'zhangsan','m','1967-04-05','1995-04-11','15000','2','1'),(3,'lisi','f','1973-01-28','1998-11-21','13000','3','1'),(4,'wangwu','f','1975-06-03','1999-12-12','12000','4','1'),(5,'maliu','m','1982-08-18','2001-07-03','8000','2','2'),(6,'tianqi','f','1983-02-15','2002-11-01','7000','2','2'),(7,'mark','m','1984-08-12','2003-10-02','6500','3','3'),(8,'john','m','1985-09-14','2005-04-03','6000','3','3'),(9,'mm','f','1990-06-08','2008-09-13','4000','4','4');
脚本导入的方法
方法1:
# mysql -p123 < emp.sql
方法2:
MariaDB [aaa]> source /path/emp.sql
方法3:
# cat emp.sql | mysql -p123
mysql> select * from aaa.emp;
+-------+----------+------+------------+------------+----------+--------+-----------+
| empno | ename | sex | birthday | hiredate | sal | deptno | managerno |
+-------+----------+------+------------+------------+----------+--------+-----------+
| 1 | boss | m | 1964-08-08 | 1995-01-01 | 20000.00 | 1 | 1 |
| 2 | zhangsan | m | 1967-04-05 | 1995-04-11 | 15000.00 | 2 | 1 |
| 3 | lisi | f | 1973-01-28 | 1998-11-21 | 13000.00 | 3 | 1 |
| 4 | wangwu | f | 1975-06-03 | 1999-12-12 | 12000.00 | 4 | 1 |
| 5 | maliu | m | 1982-08-18 | 2001-07-03 | 8000.00 | 2 | 2 |
| 6 | tianqi | f | 1983-02-15 | 2002-11-01 | 7000.00 | 2 | 2 |
| 7 | mark | m | 1984-08-12 | 2003-10-02 | 6500.00 | 3 | 3 |
| 8 | john | m | 1985-09-14 | 2005-04-03 | 6000.00 | 3 | 3 |
| 9 | mm | f | 1990-06-08 | 2008-09-13 | 4000.00 | 4 | 4 |
+-------+----------+------+------------+------------+----------+--------+-----------+
9 rows in set (0.00 sec)
mysql> use aaa;
mysql> create table dept (deptno tinyint(1),deptname varchar(30),location varchar(50));
--再创建一个部门表,注意deptno这一列和emp表的deptno列是对应的
把dept表也插入记录,方便下面的实验
mysql> insert into aaa.dept values
-> (1,'manager','beijing'),
-> (2,'it','shenzhen'),
-> (3,'sale','shanghai'),
-> (4,'services','guangzhou');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from dept;
+--------+----------+-----------+
| deptno | deptname | location |
+--------+----------+-----------+
| 1 | manager | beijing |
| 2 | it | shenzhen |
| 3 | sale | shanghai |
| 4 | services | guangzhou |
+--------+----------+-----------+
4 rows in set (0.00 sec)
第四部分:mysql的基本逻辑SQL语句-update、delete、select、聚合和分组操作
update
mysql> use aaa;
mysql> update emp set sex='m' where ename='wangwu';
把wangwu性别改成m
mysql> update emp set sal=sal+500 where ename='wangwu';
wangwu的工资加500
mysql> update emp set deptno='2' and sal=sal+1000 and managerno=2 where ename='mark';
--错误写法(and是条件语句)
mark由3号部门换成2号部门,同时工资加1000,上级管理者也改为2号部门的头
mysql> update emp set deptno='2',sal=sal+1000,managerno=2 where ename='mark';
--正确写法(一个条件三个动作)
mysql> update emp set sal=sal*1.1 where deptno=2;
2号部门的工资涨10%
工资就john和mark涨10%,其它人不涨
mysql> update emp set sal=sal1.1 where ename='john' or ename='mark';
mysql> update emp set sal=sal1.1 where ename in ('john','mark');
工资都涨10%,john和mark犯错误,就他们不涨
mysql> update emp set sal=sal1.1 where ename!='john' and ename<>'mark';
mysql> update emp set sal=sal1.1 where ename not in ('john','mark');
delete
语法: delete from emp where xxxxx;
DQL
select
mysql> use aaa;
mysql> select * from emp;
--* 代表查看所有列
mysql> select ename,sal from emp;
-- 只查看其中几列
mysql> select ename,sal*2 as "double sal" from emp;
--把工资两倍做一个别名
mysql> select deptno from emp;
mysql> select distinct deptno from emp;
--distinct 去除重复行
查询所有男员工的姓名和工资
mysql> select ename,sal from emp where sex='m';
查询工资大于8000的员工的所有信息
mysql> select * from emp where sal>8000;
查询工资在4000到8000之间的员工的所有信息(包含4000和8000的)
mysql> select * from emp where sal>=4000 and sal<=8000;
mysql> select * from emp where sal between 4000 and 8000;
查询入职时间在2001那年的员工的姓名和工资
mysql> select ename,sal from emp where year(hiredate)=2001;
mysql> select ename,sal from emp where substr(hiredate,1,4)=2001;
mysql> select ename,sal from emp where hiredate>'2000-12-31' and hiredate<'2002-01-01';
mysql> select ename,sal from emp where hiredate>='2001-01-01' and hiredate <= '2001-12-31';
mysql> select ename,sal from emp where hiredate like '2001%';
mysql> select ename,sal from emp where hiredate between '2001-01-01' and '2001-12-31';
查询2002年之后(包括2002年)入职的,并且工资大于8000的员工姓名
mysql> select ename from emp where year(hiredate)>=2002 and sal>8000;
排序操作统计工资总额,最大工资,最小工资,平均工资
mysql> select * from emp order by sal;
--以工资排序,默认升序排序
mysql> select * from emp order by sal asc;
--加不加asc都是升序
mysql> select * from emp order by sal desc;
--desc表示降序排序
mysql> select * from emp order by sex,sal;
--先按性别排,再按工资排。
结果是女的都在一起,以工资从小到大排。男的都在一起,以工资从小到大排。
mysql> select * from emp order by sex desc,sal desc;
TOP-N问题
找出工资最低的三个人的姓名和工资
mysql> select * from emp order by sal limit 3;
找出工资最高的三个人的姓名和工资
mysql> select * from emp order by sal desc limit 3;
找出工资最低的女员工的姓名和工资
mysql> select ename,sal from emp where sex='f' order by sal limit 1;
找出工资从高到低第三到第五的人的姓名和工资
limit 2,3; 从2个是下一个算起来,计算3个
mysql> select * from emp order by sal desc limit 2,3;
聚合和分组操作
mysql> select count(*) from emp;
--统计记录条数
mysql> select distinct deptno from emp;
去掉重复的
mysql> select count(distinct deptno) from emp;
+------------------------+
| count(distinct deptno) |
+------------------------+
| 4 |
+------------------------+
1 row in set (0.00 sec)
mysql> select count(distinct deptno) deptcount from emp;
--别名
+-----------+
| deptcount |
+-----------+
| 4 |
+-----------+
统计每个部门的人数
mysql> select deptno,count(*) from emp group by deptno;
mysql> select ename,deptno,count(*) from emp group by deptno;
--这种在mysql里可以查,但无意义,在oracle里属于错误语法。因为前面select的列名除了count(),max(),min(),avg(),sum()等外,别的列名都必须在group by里
统计男,女员工各有多少人
mysql> select sex,count(*) from emp group by sex;
统计每个部门里男女员工各有多少个
mysql> select deptno,sex,count() from emp group by deptno,sex;
mysql> select sex,deptno,count() from emp group by sex,deptno;
查找部门人数大于2的部门号和人数
mysql> select deptno,count() from emp group by deptno having count()>2;
求每个部门的工资总额,最大工资,最小工资,平均工资
mysql> select deptno,sum(sal),max(sal),min(sal),avg(sal) from emp group by deptno;
表链接(多表查询)
查出员工姓名和其对应的工资,部门名,部门所在地,并显示
mysql> select ename,sal,deptname,location from emp,dept where emp.deptno=dept.deptno;
子查询:
查出比wangwu工资高的人的姓名和工资
mysql> select ename,sal from emp where sal > (select sal from emp where ename='wangwu');
第五部分:DCL (授权,远程授权,回收权限)
mysql> select user,host,password from mysql.user;
grant 授权
创建用户--
mysql> create user 'aa'@'localhost' identified by "123";
Query OK, 0 rows affected (0.00 sec
数据库/数据表/数据列权限:
Alter: 修改已存在的数据表(例如增加/删除列)和索引。
Create: 建立新的数据库或数据表。
Delete: 删除表的记录。
Drop: 删除数据表或数据库。
INDEX: 建立或删除索引。
Insert: 增加表的记录。
Select: 显示/搜索表的记录。
Update: 修改表中已存在的记录。
全局管理MySQL用户权限:
file: 在MySQL服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表,刷新日志等。
SHUTDOWN: 关闭MySQL服务。
特别的权限:
ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录--其它什么也不允许做。
语法 : grant 权限 on 数据库 to 用户 identified by 密码
mysql> grant select,insert on aaa.emp to 'aa'@'localhost' identified by '123';
--授权使aa@localhost用户,对aaa库的emp表拥有select和insert权限(并且要注意:如果你的mysql没有aa用户,
那么这一句授权的同时也会帮你创建aa这个用户)
mysql> flush privileges; --刷新权限
查看MySQL用户权限:
mysql> show grants for 你的用户
mysql> show grants for root@'localhost';
mysql> revoke select on aaa.emp from 'aa'@'localhost';
--回收aa@localhost用户对aaa库的emp的select权限
mysql> flush privileges;
远程授权
用户可以登陆服务端--
mysql> grant all on aaa.* to 'abc'@'192.168.2.9‘ identified by '123';
--all代表所有权限,.代表所有库的所有表 %代表所有IP
mysql> grant all on aaa.* to 'abc'@'%' identified by '123';
--all代表所有权限,.代表所有库的所有表 %代表所有IP
mysql> flush privileges;
客户端
# mysql -u aaa -h192.168.2.9 -p123 -P 3306
-p 参数表示密码,
-P参数表示端口 ,如果是使用默认的3306就不用改端口
第六部分:常见mysql函数
函数:
mysql> select user(); 查看系统当前的用户
mysql> select database(); 查看系统当前的数据库
mysql> select version(); 查看系统当前的版本
password() 函数
mysql> show variables like '%password%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| old_passwords | ON | --这里ON了,表示使用的是兼容老密码格式的16位
+---------------+-------+
字符函数:
mysql> use aaa;
mysql> select concat(ename,' salary is ', sal) from emp;
mysql> select left(ename,2) from emp;
--取ename的左两个字符
mysql> select right(ename,2) from emp;
--取ename的右两个字符
mysql> select length(ename) from emp;
--长度函数
mysql> select substr(ename,2,2) from emp;
--从第二个字符开始截取,截取两个字符
mysql> select upper(ename) from emp;
--大写函数
mysql> select lower(ename) from emp;
--小写函数
mysql> select upper(lower(ename)) from emp;
--函数的嵌套
数学函数
mysql> select mod(10,3);
--取余
mysql> select round(4.444444);
--四舍
mysql> select round(4.544444);
--五入
日期函数
mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 18:58:38 |
+----------------+
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2022-10-21 |
+----------------+
mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2022-10-21 18:59:17 |
+---------------------+
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2022-10-21 18:59:41 |
+---------------------+
mysql> select year(now());
+-------------+
| year(now()) |
+-------------+
| 2022 |
+-------------+
mysql> select month(now());
mysql> select day(now());
mysql> select hour(now());
mysql> select minute(now());
mysql> select second(now());
mysql-3 lamp、多机lamp
01.编译软件的过程与经验
编译软件的过程与经验:
1,./configure 通过指定参数,来确认你想要安装的软件安装在哪里,加上哪些功能和去掉哪些功能(如果这一步报错,基本都是缺少依赖包;)
解决方法:使用yum去安装,一般来说,rhel做为一个成熟的linux操作系统,常见的底层依赖包都自带了,所以去安装下面这两个组,一般都会有你所需要的依赖包。
如果缺少依赖包在rhel的yum源里找不到,则上网下载第三方的软件,先编译第三方软件,再编译本软件
2,make 相当于是把你上一步定义好的,把这个软件给做出来(这一步一般很少出错,如果出错,问题都比较麻烦。可能是一些兼容性的问题等等,你可以尝试上网查询解决方法,如果查不到,只能换个环境或者换个软件版本或者换些编译参数重新编译)
3, make install 把做好的软件,安装到你第一步所指定的安装目录里(这一步几
乎不会出错的,如果出错,应该是安装路径空间不够,或者路径已经存在并且没有权限)
关于./configure参数选择的基本方法:
./configure --help 查看所有的编译参数
第一个重要参数
--prefix= 此参数指定安装目录(不知道目录就安装到PATH环境里面,一般安装到/usr/local/或者/usr/local/软件名下)
第二类重要参数:
--enable-xxx 打开一个功能(默认是关闭的)
--disable-xxx 关闭一个功能(默认是打开的)
如果你是新手,你就不加任何功能参数,全部使用默认值。但又如果你怕少了功能造成以后需要重编,你可以加上所有的enable参数(但加得越多,错误概率也越大,因为调用的依赖会多,有可能会因为少包而报错)
第三类参数:
--with-xxx=DIR 指定一个目录,调用此目录的功能
假设一个软件abc,安装到/usr/local和安装到/usr/local/abc之间的区别?
安装到/usr/local下:
优点: 此软件的命令一般会安装到/usr/local/bin或/usr/local/sbin等;这些路径都默认在$PATH里,所以安装的命令可以直接用,而不用使用绝对路径。
库文件一般都会安装到/usr/local/lib下,所以把它加入ldconfig,以后所有安装在此目录的库文件都可以被找到。
缺点: 不方便删除,因为很多软件都安装到/usr/local下
安装到/usr/local/abc下:
优缺点与上面正好相反
最终建议:小软件一般默认安装/usr/local/;大软件安装/usr/local/软件名/下
关于ldconfig,一个软件的库文件是有可能被其它软件所调用,那么其它软件能否找到你的库文件呢?
一般来说,库文件安装到/lib,/lib64,/usr/lib/,/usr/lib64等,都可以被找得到.那么如果一个软件abc把库文件安装到/usr/local/abc/lib,别人想要找到,你就要把这个路径加入到ldconfig可以找到的路径列表里面去。
做法为:
vim /etc/ld.so.conf --在这个主配置文件里加上一行,写上让别人要查找库文件的路径
include ld.so.conf.d/*.conf --或者在这里的任意.conf结尾的子配置文件里加上一行也可以
/usr/local/abc/lib
ldconfig --上面加入路径后,就使用此命令让其生效
===
02.linux(centos7) + apache2.4 + mysql5.6 + php5.6/perl/python【lamp】
mysql-4 主从架构、双主架构、半同步、延时复制
01.ab复制原理
02.ab复制搭建
03.ab复制其他做法讨论
04.ab复制验证
05.其他复制架构讨论
06.双主级联架构搭建
07.半同步复制
08.延时复制
mysql-5 代理介绍、mysql水平切分、垂直切分、读写分离、综合
01.代理介绍
02.实验环境准备-amoeba
03.水平切分
04.垂直切分
05.读写分离
06.读写分离+切分讨论
07.MySQL 5.7多源复制
https://blog.51cto.com/ios9/5686288
root:18:41:50@[(none)]> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.40.26.9
Master_User: rpl_grant
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.156149
Read_Master_Log_Pos: 1160622
Relay_Log_File: 10-40-26-216-relay-bin-account_db_slave.231206
Relay_Log_Pos: 1160835
Relay_Master_Log_File: mysql-bin.156149
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table: mysql.%,performance_schema.%,test.%,information_schema.%,sys.%,backup_table.%,canal_manager.%,hr365-actionlog.%,ehr-attendance.t_employee_card_result_2017%,ehr-attendance.t_employee_card_result_2018%,ehr-attendance.t_employee_card_result_2019%,ehr-attendance.t_employee_card_result_2020%,ehr-attendance.t_employee_card_record_2017%,ehr-attendance.t_employee_card_record_2018%,ehr-attendance.t_employee_card_record_2019%,ehr-attendance.t_employee_card_record_2020%,ehr-attendance.t_schedule_2017%,ehr-attendance.t_schedule_2018%,ehr-attendance.t_schedule_2019%,ehr-attendance.t_schedule_2020%,ehr-attendance.t_clockin_result_2019%,ehr-attendance.t_clockin_result_2020%,ehr-attendance.t_clockin_record_2019%,ehr-attendance.t_clockin_record_2020%
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1160622
Relay_Log_Space: 1161153
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 3189588994
Master_UUID: 3c880df1-7832-11ec-b849-fa163e8a9bd1
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 3c880df1-7832-11ec-b849-fa163e8a9bd1:48839851-63021921
Executed_Gtid_Set: 0396fc6f-7830-11ec-86a3-fa163e499516:218869541-1264584105,
03a9c58f-7833-11ec-b051-fa163e1ddfb3:1639797-5928135,
3c880df1-7832-11ec-b849-fa163e8a9bd1:14011493-63021921,
4489b154-a347-11ec-9a40-fa163ed66e16:1-4739649,
4a357139-7830-11ec-8b74-fa163e7cecf5:22462356-89904257,
5b91fad2-782f-11ec-b2f7-fa163e8ebd9d:207092147-993677502,
6753a377-7833-11ec-ad03-fa163ec158b2:1312216-5497354,
6ee131ba-7830-11ec-ac4e-fa163e99c72d:1555537-6436255,
760de42f-7832-11ec-a85d-fa163e324e9c:30861258-76357549,
915be3d4-7830-11ec-89a8-fa163effd135:307488944-1269455484,
ad71bd1a-0e3d-11ed-9112-fa163ee44ecb:86536270-140390519,
c314ffdf-782f-11ec-a253-fa163e3b4560:38460781-240464513,
c99117c8-fd6d-11ec-b754-fa163ee45bb7:16897507-48496671,
ca5be4eb-29ab-11ed-9e6f-fa163ee4714a:9185391-193280978,
cab2e5eb-782f-11ec-8c19-fa163e73d425:225766939-826107442
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name: account_db_slave
Master_TLS_Version:
*************************** 2. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.40.26.6
Master_User: rpl_grant
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.143426
Read_Master_Log_Pos: 57434
Relay_Log_File: 10-40-26-216-relay-bin-buslog_db_slave.214958
Relay_Log_Pos: 57647
Relay_Master_Log_File: mysql-bin.143426
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table: mysql.%,performance_schema.%,test.%,information_schema.%,sys.%,backup_table.%,canal_manager.%,hr365-actionlog.%,ehr-attendance.t_employee_card_result_2017%,ehr-attendance.t_employee_card_result_2018%,ehr-attendance.t_employee_card_result_2019%,ehr-attendance.t_employee_card_result_2020%,ehr-attendance.t_employee_card_record_2017%,ehr-attendance.t_employee_card_record_2018%,ehr-attendance.t_employee_card_record_2019%,ehr-attendance.t_employee_card_record_2020%,ehr-attendance.t_schedule_2017%,ehr-attendance.t_schedule_2018%,ehr-attendance.t_schedule_2019%,ehr-attendance.t_schedule_2020%,ehr-attendance.t_clockin_result_2019%,ehr-attendance.t_clockin_result_2020%,ehr-attendance.t_clockin_record_2019%,ehr-attendance.t_clockin_record_2020%
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 57434
Relay_Log_Space: 57964
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 277893665
Master_UUID: 6ee131ba-7830-11ec-ac4e-fa163e99c72d
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 6ee131ba-7830-11ec-ac4e-fa163e99c72d:5064758-6436255
Executed_Gtid_Set: 0396fc6f-7830-11ec-86a3-fa163e499516:218869541-1264584105,
03a9c58f-7833-11ec-b051-fa163e1ddfb3:1639797-5928135,
3c880df1-7832-11ec-b849-fa163e8a9bd1:14011493-63021921,
4489b154-a347-11ec-9a40-fa163ed66e16:1-4739649,
4a357139-7830-11ec-8b74-fa163e7cecf5:22462356-89904257,
5b91fad2-782f-11ec-b2f7-fa163e8ebd9d:207092147-993677502,
6753a377-7833-11ec-ad03-fa163ec158b2:1312216-5497354,
6ee131ba-7830-11ec-ac4e-fa163e99c72d:1555537-6436255,
760de42f-7832-11ec-a85d-fa163e324e9c:30861258-76357549,
915be3d4-7830-11ec-89a8-fa163effd135:307488944-1269455484,
ad71bd1a-0e3d-11ed-9112-fa163ee44ecb:86536270-140390519,
c314ffdf-782f-11ec-a253-fa163e3b4560:38460781-240464513,
c99117c8-fd6d-11ec-b754-fa163ee45bb7:16897507-48496671,
ca5be4eb-29ab-11ed-9e6f-fa163ee4714a:9185391-193280978,
cab2e5eb-782f-11ec-8c19-fa163e73d425:225766939-826107442
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name: buslog_db_slave
Master_TLS_Version:
root:18:43:33@[(none)]> show slave status for channel "account_db_slave" \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.40.26.9
Master_User: rpl_grant
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.156151
Read_Master_Log_Pos: 199114
Relay_Log_File: 10-40-26-216-relay-bin-account_db_slave.231210
Relay_Log_Pos: 199327
Relay_Master_Log_File: mysql-bin.156151
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table: mysql.%,performance_schema.%,test.%,information_schema.%,sys.%,backup_table.%,canal_manager.%,hr365-actionlog.%,ehr-attendance.t_employee_card_result_2017%,ehr-attendance.t_employee_card_result_2018%,ehr-attendance.t_employee_card_result_2019%,ehr-attendance.t_employee_card_result_2020%,ehr-attendance.t_employee_card_record_2017%,ehr-attendance.t_employee_card_record_2018%,ehr-attendance.t_employee_card_record_2019%,ehr-attendance.t_employee_card_record_2020%,ehr-attendance.t_schedule_2017%,ehr-attendance.t_schedule_2018%,ehr-attendance.t_schedule_2019%,ehr-attendance.t_schedule_2020%,ehr-attendance.t_clockin_result_2019%,ehr-attendance.t_clockin_result_2020%,ehr-attendance.t_clockin_record_2019%,ehr-attendance.t_clockin_record_2020%
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 199114
Relay_Log_Space: 199645
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 3189588994
Master_UUID: 3c880df1-7832-11ec-b849-fa163e8a9bd1
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 3c880df1-7832-11ec-b849-fa163e8a9bd1:48839851-63022399
Executed_Gtid_Set: 0396fc6f-7830-11ec-86a3-fa163e499516:218869541-1264592519,
03a9c58f-7833-11ec-b051-fa163e1ddfb3:1639797-5928146,
3c880df1-7832-11ec-b849-fa163e8a9bd1:14011493-63022399,
4489b154-a347-11ec-9a40-fa163ed66e16:1-4739649,
4a357139-7830-11ec-8b74-fa163e7cecf5:22462356-89904829,
5b91fad2-782f-11ec-b2f7-fa163e8ebd9d:207092147-993680973,
6753a377-7833-11ec-ad03-fa163ec158b2:1312216-5497368,
6ee131ba-7830-11ec-ac4e-fa163e99c72d:1555537-6436282,
760de42f-7832-11ec-a85d-fa163e324e9c:30861258-76357549,
915be3d4-7830-11ec-89a8-fa163effd135:307488944-1269459285,
ad71bd1a-0e3d-11ed-9112-fa163ee44ecb:86536270-140390519,
c314ffdf-782f-11ec-a253-fa163e3b4560:38460781-240466401,
c99117c8-fd6d-11ec-b754-fa163ee45bb7:16897507-48497430,
ca5be4eb-29ab-11ed-9e6f-fa163ee4714a:9185391-193308914,
cab2e5eb-782f-11ec-8c19-fa163e73d425:225766939-826107442
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name: account_db_slave
Master_TLS_Version:
1 row in set (0.00 sec)
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master 当前落后主库的时间(秒)
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates 当slave前同步状态
for i in `/data/mysql_5.7.31/bin/mysql -u root -p'123456' -e 'show slave status \G'|grep -Ei "Channel_Name"|awk '{print $NF}'`;do echo "$i --";/data/mysql_5.7.31/bin/mysql -u root -p'123456' -e "show slave status for channel \"${i}\" \G"|grep -Ei "Slave_SQL_Running_State:";echo " ";done