目录

MySQL操作

目录

一、连接与基本使用

  1. 连接数据库
mysql -h host.com -P 3306 -uroot -p
  1. 基本查询
SELECT VERSION();                                    //查询版本

SHOW DATABASES;                                 //查询数据库

USE mysql;                                      //使用数据库

SHOW TABLES;                                    //查询数据表 

SHOW TABLE STATUS FROM mysql WHERE name = 'user';   //查询数据表状态
show table status like 'fileCompare';                //查询数据表状态
SELECT TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'dscg' AND TABLE_NAME = 'fileCompare';

DESC user;
SHOW FULL COLUMNS FROM user;                    //查看数据表字段

SHOW CREATE TABLE user;                         //查看数据表建表语句DDL

SHOW INDEX FROM user;                           //查看数据表索引

SHOW STATUS;                                    //查询Server的状态

SHOW VARIABLES;                                 //MySQL的变量

SHOW PROCESSLIST;                               //已登录用户信息、连接信息

SHOW GRANTS FOR user@'localhost';               //列出用戶已有的授权

show variables like '%connections%';            //查看最大连接数(set global max_connections=1000;)

show status like  'Threads%';                   //查看连接线程状态

#其他常用SQL
SHOW ENGINE innodb status;                     #展示查询InnoDB状态,可以排查死锁
SHOW PROCESSLIST;                               #显示用户正在运行的线程
SET GLOBAL slow_query_log = 0;                 #关闭慢查询
SHOW VARIABLES LIKE 'slow_query_log';          #查询是否开启慢查询日志
SHOW variables LIKE 'log_bin';                 #查询是否开启binlog
SHOW VARIABLES LIKE "%innodb_lock_wait_timeout%";          #查询锁超时时间
SHOW GLOBAL VARIABLES LIKE "%innodb_lock_wait_timeout%";   #查询全局锁超时时间
SELECT * FROM information_schema.INNODB_LOCKS;              #查看正在锁的事务
SELECT * FROM information_schema.INNODB_LOCK_WAITS;       #查看等待锁的事务
SELECT trx_mysql_thread_id,trx_query from information_schema.innodb_trx where trx_state='LOCK WAIT';   #查询锁表
  1. 开启慢查询
slow_query_log = 1                              #开启慢查询日志
slow_query_log_file = /path/to/slow-query.log   #指定慢查询日志文件的路径和文件名。
log_slow_rate_limit = 10                        #相同的慢查询在每秒内最多记录10次
log_slow_verbosity = query_plan,innodb          #慢查询日志的详细程度
long_query_time = 1                             #慢查询的时长阈值 秒
  1. 备份
/usr/bin/mysqldump -h${host} -u${user} -p${password} ${database} --single-transaction --skip-add-locks --quick --opt --routines --triggers -c > ${database}.sql
mysql -h${host} -u${user} -p${password} ${database} --init-command="SET autocommit=0; SET foreign_key_checks=0; SET unique_checks=0;" < ${database}.sql

二、用户与权限

--创建用户组
GROUPADD group1

--创建用户
CREATE USER 'username'@'host' IDENTIFIED BY '123456';
ALTER USER 'username'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
--删除用户
DROP USER 'username'@'%';

--修改用户密码
SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');
ALTER USER 'root'@'%' identified BY '<新密码>';        -- 在MySQL 8.0及以上版本中,可以使用ALTER USER语句来修改用户密码。


--用户加入用户组
useradd -g group1 user
useradd user1 -g group1 -G group2                                   -- -g:指定用户所属的起始群组  -G:指定用户所属的附加群组

--授予用户权限
GRANT privilege ON db.table TO 'user'@'host';                       -- privilege:SELECT,INSERT,UPDATE ... ALL
GRANT privilege ON db.table TO 'user'@'host' WITH GRANT OPTION;     -- 可再授权权限
--删除用户权限
REVOKE privilege ON db.table FROM 'user'@'host';


-- 例子:创建用户、创建数据库、授予数据库权限、删除用户
CREATE USER IF NOT EXISTS '${username}'@'%' IDENTIFIED WITH mysql_native_password BY '${123456}';
CREATE DATABASE IF NOT EXISTS ${dbname} DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP ON ${dbname}.* TO '${username}'@'%';
REVOKE SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER ON ${dbname}.* TO '${username}'@'%';  --撤销授权
SELECT * FROM mysql.user WHERE User='xxxx' AND Host='%'\G --查看所有权限
SELECT * FROM mysql.db WHERE User='xxxx' AND Host='%'\G
FLUSH PRIVILEGES;   --MySQL 8.0+ 通常无需手动刷新
mysql -hlocalhost -uroot -p -D ${dbname} --init-command="SET autocommit=0; SET foreign_key_checks=0; SET unique_checks=0;" < ${DB}.sql        --导入数据
DROP USER '${username}'@'%';

三、常用SQL

--导出数据(确保导出和导入环境的MySQL版本兼容,导出后验证SQL文件完整性和数据行数。 对大表可使用mydumper/myloader工具提高速度)
/usr/bin/mysqldump -h${local_host} -u${db_user} -p ${database} ${tablename} --single-transaction --skip-add-locks --quick --opt --routines --triggers -t -c | gzip > ${tablename}.sql
-- -t 无建表语句 -c 完整插入语句含字段映射  -R,--routines: Dump stored routines (functions and procedures).  --triggers: Dump triggers for each dumped table.(Defaults to on; use --skip-triggers to disable.)

--导入数据
mysql -h${db_host} -u${db_user} -p${db_password} ${database} --init-command="SET autocommit=0; SET foreign_key_checks=0; SET unique_checks=0;" < ${large_file}.sql


--插入、查询、更新、删除
INSERT INTO db.table(`id`, `f1_name`, `create_time`) VALUES (1,'name1', '2021-01-01 12:00:00');

SELECT * FROM tabel WHERE f1_name like 'name%' AND create_time >= "2021-01-01 12:00:00" ORDER BY id;

UPDATE db.table SET f1_name = 'name2', create_time = '2021-01-01 12:00:00' WHERE f1_name = 'name1';

DELETE FROM db.table where f1_name='name2';


--批量插入(插入前先删除)
REPLACE INTO db.table(`id`, `f1_name`, `create_time`) VALUES (1,'name1', '2021-01-01 12:00:00'),(2,'name2', '2021-01-01 12:00:00');

--批量插入(存在则更新)
INSERT INTO db.table(`id`, `f1_name`, `create_time`) VALUES (1,'name1', '2021-01-01 12:00:00'),(2,'name2', '2021-01-01 12:00:00') 
ON duplicate key UPDATE f1_name= VALUES(f1_name),create_time= VALUES(create_time);


--批量更新
UPDATE db.table 
    SET t1 = CASE id 
        WHEN 1 THEN 123 
        WHEN 2 THEN 456
        WHEN 3 THEN 789
    END, 
    t2 = CASE id 
        WHEN 1 THEN 't1_value'
        WHEN 2 THEN 't2_value'
        WHEN 3 THEN 't3_value'
    END
WHERE id IN (1,2,3)

--批量删除
DELETE FROM 
    db.table
WHERE 
    id IN (1,2,3)

四、其他SQL

  1. 获取当前时间判断,为上午12:00前则展示到昨天数据,下午则展示到当天数据
SELECT *
FROM test.xxxdaily_stats AS a 
WHERE a.DAY_ID <= cast(
        IF(
            CURRENT_TIMESTAMP() < DATE_FORMAT(CURDATE(), '%Y-%m-%d 12:00:00'),
            DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 DAY), '%Y%m%d'),
            DATE_FORMAT(CURDATE(), '%Y%m%d')
        ) as SIGNED INTEGER
    );
  1. 行转列
-- 表字段: day_id | level | count_num
SELECT
    "a".day_id,
    sum(case "level" when 1 then count_num end) as level1,
    sum(case "level" when 2 then count_num end) as level2,
    sum(case "level" when 3 then count_num end) as level3,
    sum(case "level" when 4 then count_num end) as level4,
    sum(case "level" when 5 then count_num end) as level5,
    sum(case "level" when 6 then count_num end) as level6,
    sum(case "level" when 7 then count_num end) as level7,
    sum(case "level" when 8 then count_num end) as level8,
    sum(case "level" when 9 then count_num end) as level9,
    sum(case "level" when 10 then count_num end) as level10
FROM
    level_count AS "a"

五、字符集及排序规则

字段类型推荐字符集推荐排序规则理由
商品标题/描述utf8mb4utf8mb4_unicode_ci支持多语言和特殊字符
用户信息(姓名/地址)utf8mb4utf8mb4_unicode_ci国际化支持
用户名/登录账号utf8mb4utf8mb4_bin精确匹配,区分大小写
SKU编码/订单号asciiascii_bin通常只需ASCII字符,二进制精确匹配
商品分类/标签utf8mb4utf8mb4_unicode_ci支持多语言分类
搜索关键词utf8mb4utf8mb4_unicode_ci支持多语言搜索
评论/评价内容utf8mb4utf8mb4_unicode_ci支持emoji和特殊字符

六、其他数据库PostgreSQL

psql postgres://username:password@host:port/dbname  
psql -U username -h hostname -p port -d dbname 
\l           --查看数据库
\c dbname    --切换数据库
\dt          --查看表
--查看最大连接数
show max_connections;

--管理员保留连接数
show superuser_reserved_connections;

--当前连接数
select count(1) from pg_stat_activity;

--查询数据库连接
SELECT datname,pid,usename,application_name,client_addr,query_start,state_change,"state",query from pg_stat_activity  ORDER BY query;

--关闭连接
select pg_terminate_backend(pid) from pg_stat_activity where client_addr ='';
← 返回技术