首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
142 阅读
2
php接口优化 使用curl_multi_init批量请求
132 阅读
3
2024年备考系统架构设计师
102 阅读
4
《从菜鸟到大师之路 ElasticSearch 篇》
102 阅读
5
PHP 文件I/O
89 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
785
篇文章
累计收到
8
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
785
篇与
的结果
2023-11-28
关于mysql的lower_case_table_names引发的思考
lower_case_table_names设置大小写敏感的三个值0、1、2的区别?lower_case_table_names参数详解1.参数说明:lower_case_table_names= 0 表名 存储为给定的大小和比较是区分大小写的lower_case_table_names = 1 表名 存储在磁盘是小写的 ,但是 比较的时候是不区分大小写lower_case_table_names= 2 表名 存储为给定的大小写 但是 比较的时候是小写的unix,linux下lower_case_table_names默认值为 0 .Windows下默认值是 1 .Mac OS X下默认值是 22.查看方法:# 进入mysql命令行 执行以下任一语句查看:show variables like 'lower_case_table_names';select @@lower_case_table_names;3.更改方法:更改数据库参数文件 my.cnf 在mysqld下 添加或修改 lower_case_table_names = 1 之后重启数据库4.现实情况修改 注意事项:因目前MySQL安装在 Linux 系统上较多 初始化时采取了默认的lower_case_table_names值 即区分大小写,后续可能会造成同一实例大小写库表都存在的情况,调用时还要注意大小写。这时 更改步骤如下:1.核实实例中是否存在大写的库及表2.将大写的库名及表名改为小写更改库名可参考 : MySQL数据库改名的三种方法更改表名:rename table TEST_TB to test_tb;3.设置lower_case_table_names = 14.重启数据库
2023年11月28日
33 阅读
0 评论
0 点赞
2023-11-28
MySQL数据库改名的三种方法
如果表是 MyISAM 那么可以直接去到数据库目录 mv 就可以。Innodb完全不行,自己测试过,会提示相关表不存在。第一种方法:RENAME database olddbname TO newdbname这个语法在 mysql-5.1.7 中被添加进来,到了mysql-5.1.23又去掉了,官方不推荐,会有丢失数据的危险!第二种方法:1.创建需要改成新名的数据库。2.mysqldum 导出要改名的数据库3.删除原来的旧库(确定是否真的需要)当然这种方法虽然安全,但是如果数据量大,会比较耗时。#创建数据库 CREATE DATABASE IF NOT EXISTS `库名` default charset utf8mb4 COLLATE utf8mb4_unicode_ci; # 将db1库备份到db1.sql文件 mysqldump -u root -p db1 > /tmp/db1.sql; #Enter password: #[root@xxx ~]# # 导入备份文件到新库db2 mysql -u root -p db2 < /tmp/db1.sql; #Enter password: #[root@xxx ~]# # 删除旧库(如果真的需要) DROP DATABASE db1;第三种方法:我这里就用一个脚本,很简单,相信大家都看的懂 newdatabase.sh#!/bin/bash # 假设将db1数据库名改为db2 # MyISAM直接更改数据库目录下的文件即可 # 下面脚本是创建新数据库,获取旧数据库所有表名,将其循环移动到新数据库 mysql -uroot -p123456 -e 'create database if not exists db2' list_table=$(mysql -uroot -p123456 -Nse "select table_name from information_schema.TABLES where TABLE_SCHEMA='db1'") for table in $list_table do mysql -uroot -p123456 -e "rename table db1.$table to db2.$table" done-p123456脚本中把明文密码暴露出来。。。[root@xxx script]# mysql --version mysql Ver 8.0.35 for Linux on x86_64 (MySQL Community Server - GPL) [root@xxx script]# bash newdatabase.sh mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. #mysql:[警告]在命令行界面使用密码可能是不安全的。 执行成功了但不安全,我们做下调整: 生成密文 sginpwd.sh#!/bin/bash function b64Code() { #参数1: 需要加密的串 passauth=$1 #参数2: 加密的次数,次数越多密码越长 for i in `seq 1 $2` do #python2 passauth=`echo $passauth |python -c "import base64;s=raw_input();print(base64.b64encode(s))"` #python3 #passauth=`echo $passauth |python -c "import base64;s=input(); print(base64.b64encode(s.encode()).decode());"` echo "[+]第${i}次加密结果:$passauth" done } #执行 b64Code 加密方法,使用明文密码加密10次 b64Code 123456 10 #密码是字符串加上单引号执行sginpwd.sh[root@xxx script]# bash sginpwd.sh [+]第1次加密结果:MTIzNDU2 [+]第2次加密结果:TVRJek5EVTI= [+]第3次加密结果:VFZSSmVrNUVWVEk9 [+]第4次加密结果:VkZaU1NtVnJOVVZXVkVrOQ== [+]第5次加密结果:VmtaYVUxTnRWbkpPVlZaWFZrVnJPUT09 [+]第6次加密结果:Vm10YVlWVXhUblJXYmtwUFZsWmFXRlpyVm5KUFVUMDk= [+]第7次加密结果:Vm0xMFlWbFdWWGhVYmxKWFltdHdVRlpzV21GWFJscHlWbTVLVUZWVU1Eaz0= [+]第8次加密结果:Vm0weE1GbFdiRmRXV0doVllteEtXRmx0ZEhkVlJscHpWMjFHV0ZKc2NIbFdiVFZMVlVaV1ZVMUVhejA9 [+]第9次加密结果:Vm0wd2VFMUdiRmRpUm1SWFYwZG9WbGx0ZUV0WFJteDBaRWhrVmxKc2NIcFdNakZIVjBaS2MyTkliRmRpVkZaTVZsVmFWMVpWTVVWaGVqQTk= [+]第10次加密结果:Vm0wd2QyVkZNVWRpUm1ScFVtMVNXRll3Wkc5V2JHeDBaVVYwV0ZKdGVEQmFSV2hyVm14S2MyTkljRmROYWtaSVZqQmFTMk15VGtsaVJtUnBWa1phVFZac1ZtRldNVnBXVFZWV2FHVnFRVGs9newdatabase_beff.sh#!/bin/bash # 假设将db1数据库名改为db2 # MyISAM直接更改数据库目录下的文件即可 # 下面脚本是创建新数据库,获取旧数据库所有表名,将其循环移动到新数据库 function deCode() { #参数1: 加密串内容 passDstr=$1 #参数2: 密码解析次数 for i in `seq 1 $2` do passDstr=`echo $passDstr |python -c "import base64;s=input(); print(base64.b64decode(s.encode()).decode());"` done } #b64Code方法得到的密文放在这里 mysqlPass="Vm0wd2QyVkZNVWRpUm1ScFVtMVNXRll3Wkc5V2JHeDBaVVYwV0ZKdGVEQmFSV2hyVm14S2MyTkljRmROYWtaSVZqQmFTMk15VGtsaVJtUnBWa1phVFZac1ZtRldNVnBXVFZWV2FHVnFRVGs9" #使用加密10次的密文 解密 deCode $mysqlPass 10 mysql -uroot -p"${passDstr}" -e "show databases;" mysql -uroot -p"${passDstr}" -e 'create database if not exists db2' list_table=$(mysql -uroot -p"${passDstr}" -Nse "select table_name from information_schema.TABLES where TABLE_SCHEMA='db1'") for table in $list_table do mysql -uroot -p"${passDstr}" -e "rename table db1.$table to db2.$table" done function deCode() { #参数1: 加密串内容 passDstr=$1 #参数2: 密码解析次数 for i in `seq 1 $2` do #python2 passDstr=`echo $passDstr |python -c "import base64;s=raw_input();print(base64.b64decode(s))"` #python3 #passDstr=`echo $passDstr |python -c "import base64;s=input(); print(base64.b64decode(s.encode()).decode());"` done } #b64Code方法得到的密文放在这里 mysqlPass="Vm0wd2QyVkZNVWRpUm1ScFVtMVNXRll3Wkc5V2JHeDBaVVYwV0ZKdGVEQmFSV2hyVm14S2MyTkljRmROYWtaSVZqQmFTMk15VGtsaVJtUnBWa1phVFZac1ZtRldNVnBXVFZWV2FHVnFRVGs9" #使用加密10次的密文 解密 deCode $mysqlPass 10 mysql -uroot -p"${passDstr}" -e "show databases;" mysql -uroot -p"${passDstr}" -e 'create database if not exists db2' list_table=$(mysql -uroot -p"${passDstr}" -Nse "select table_name from information_schema.TABLES where TABLE_SCHEMA='db1'") for table in $list_table do mysql -uroot -p"${passDstr}" -e "rename table db1.$table to db2.$table" done[root@xxx script]# bash newdatabase_beff.sh mysql: [Warning] Using a password on the command line interface can be insecure. +--------------------+ | Database | +--------------------+ | db1 | | db2 | +--------------------+ mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. #登录mysql,可以看到db1数据表迁移到db2了 mysql> use db1; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +---------------+ | Tables_in_db1 | +---------------+ | active_log | | new | +---------------+ 2 rows in set (0.00 sec) mysql> show tables; Empty set (0.00 sec) mysql> use db2; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +---------------+ | Tables_in_db2 | +---------------+ | active_log | | new | +---------------+ 2 rows in set (0.00 sec)这里用到了rename table,改表名的命令,但是如果新表名后面加数据库名,就会将老数据库的表移动到新的数据库,所以,这种方法即安全,又快速。参考链接: https://ost.51cto.com/posts/16797 https://blog.csdn.net/China_AT001/article/details/116916740 番外:所有表是 MyISAM 修改数据库名1.先停止数据库服务systemctl stop mysqld #service mysql stop 2.到数据库目录 mv 数据库目录默认在/var/lib/mysql/,可以通过 find / -name mysql 查找mv /var/lib/mysql/old_database /var/lib/mysql/new_database3.启动数据库服务systemctl start mysqld #service mysql start4.登录mysql,如果显示new_database数据库,说明修改成功数据库名了show databases;最终结果目录改了,数据库没显示,操作失败不知道啥原因,以后再看吧
2023年11月28日
12 阅读
0 评论
0 点赞
2023-11-27
MySQL数据库SQLSTATE[22007]: Invalid datetime format 日期类型不能为空值的解决办法
如果你的数据库是mysql,如果你创建表或插入数据时遇到的BUG--它长这样: Invalid datetime format: 1292 Incorrect datetime value: '' for column 'xxx' at row 1 或 1067 - Invalid default value for 'xx' 那么我将赐予你 两套剑法:(一)追魂夺命剑:修改sql_mode参数值七十二路“追魂夺命剑”,此剑法快似闪电、迅捷无比,更兼招数精奇;”着“的一声刺中小怪sql_mode,小怪即便使出生平绝技”STRICT_TRANS_TABLES“,也会被剑击中咽喉,大叫一声摔倒见阎王,招数之快令人难以想象。SELECT @@sql_mode; #ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION set sql_mode ='ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';重启mysql服务后小怪诈尸了,又使出”STRICT_TRANS_TABLES“,需要到改配置文件一劳永逸# 改变/etc/my.cnf(windows修改my.ini),重启mysql服务 [mysqld] sql_mode = ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION(二)玄铁重剑:使用NULL替代0000-00-00 00:00:00/0000-00-00用了重剑后,越是平平无奇的剑招,越是威力极大。但它还是有招式,还差那么一丁点到无招的境界,而且剑法也必须配合重剑使用才行。ALTER TABLE active_log MODIFY COLUMN start_date datetime NULL;建表SQLDROP TABLE IF EXISTS `active_log`; CREATE TABLE `active_log` ( `id` bigint(11) unsigned NOT NULL auto_increment, `start_date` datetime NOT NULL default '0000-00-00 00:00:00' COMMENT '活动开始时间', created_date DATE DEFAULT '0000-00-00', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
2023年11月27日
38 阅读
0 评论
0 点赞
2023-11-27
哈希分表方法
/* * 根据账号名获取分表 * 函数接受两个参数,$u代表账号名,$n代表分表的数量,默认为256(即账号表分256张表) */ function calc_hash_tbl($u, $n = 256) { $h = sprintf('%u', crc32($u));//使用crc32函数计算账号名的哈希值,并使用sprintf函数将其转换为无符号整数 $h1 = intval($h / $n);//将哈希值除以分表数量$n得到$h1 return $h1 % $n;//将$h1对$n取模得到最终的分表索引值 }这个函数默认输出的值范围是从0到255,因为在最后一行代码中,对$h1取模$n的操作会得到0到$n−1的余数。$accountname = "xx"; $table = "account_info_".calc_hash_tbl($accountname); ...
2023年11月27日
9 阅读
0 评论
0 点赞
2023-11-21
strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数
strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数strace:跟踪进程的系统调用是 Linux 环境下的一款 程序调试工具 , 用于检查一个应用程序所使用的系统调用以及它所接收的系统信息 。strace会追踪程序运行时的整个生命周期,输出每一个系统调用的名字、参数、返回值和执行所消耗的时间等,是高级运维和开发人员排查问题的杀手铜。 strace命令的参数选项及说明-c 统计每一个系统调用所执行的时间、次数和出错的次数等 -d 输出strace关于标准错误的调试信息 -f 跟踪目标进程,以及目标进程创建的所有子进程 -ff 如果提供-o filename,则将所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号 -i 输出系统调用的入口指针 -q 禁止输出关于脱离的消息 -r 输出每一个系统调用的相对时间 -t 在输出中的每一行前加上时间信息。例如16:45:28 -tt 在输出中的每一行前加上时间信息,精确到微秒。例如11:18:59.759546端 -ttt 在输出中的每一行前加上时间信息,精确到微秒,而且时间表示为UNIX时间戳。例如1486111461.650434 -T 显示每次系统调用所花费的时间 -v 对于某些相关调用,把完整的环境变量、文件stat结构等打印出来 -x 以十六进制形式输出非标准字符率 -xx 所有字符串以十六进制形式输出 -e expr 输出过滤器,通过表达式,可以过滤掉你不想要的输出 expr是一个表达式,用于控制如何跟踪:[qualifier=][!][valuel[,value2].. 说明: ①qualifier 只能是trace、abbrev、verbose、raw、signal、read、write其中之一 ②value是用来限定的符号或数字 ③默认的qualifier是trace ④感叹号是否定符号 例如: -e open等价于-e trace=open,表示只跟踪open调用 而-e trace!=open表示跟踪除了open以外的其他调用 常见选项: -e trace=[set] 只跟踪指定的系统调用 -e trace=file 只跟踪与文件操作有关的系统调用 -e trace=process 只跟踪与进程控制有关的系统调用 -e trace-network 只跟踪与网络有关的系统调用 -e trace=signal 只跟踪与系统信号有关的系统调用 -e trace=desc 只跟踪与文件描述符有关的系统调用 -e trace=ipc 只跟踪与进程通信有关的系统调用 -e abbrev=[set] 设定strace输出的系统调用的结果集 -e raw=[set] 将指定的系统调用的参数以十六进制显示 -e signal=[set] 指定跟踪的系统信号 -e read=[set] 输出从指定文件中读出的数据 -e write=[set] 输出写入到指定文件中的数据 -o filename 将strace的输出写入文件filename -p pid 指定要跟踪的进程pid,要同时跟踪多个pid,重复多次p选项即可* -s strsize 指定输出的字符串的最大长度,默认为32。并没有将文件名视为字符串,默认全部输出 -u username 以usemame的UID和GID执行所跟踪的命令 排查Nginx403 forbidden错误strace -tt -f /applicatton/nginx/sbin/nginx只跟踪与文件操作有关的系统调用 strace -tt -f -e trace=file /application/nginx/sbin/nginx #只跟综与文件操作有关的系统调用。通过pid 跟踪进程pgrep nginx[root@bzhl ~]# pgrep nginx 1884 7785 7786 7787pstree -p 1884(端口号)[root@bzhl ~]# pstree -p 1884 nginx(1884)─┬─nginx(7785) ├─nginx(7786) └─nginx(7787)strace -tt -f -e trace=file -p 7785(端口号)[root@bzhl ~]# strace -tt -f -e trace=file -p 7785 strace: Process 7785 attached 跟踪系统调用统计 strace不仅能够追踪系统调用,使用选项-c还能对进程所有的系统调用做一个统计分析。 [root@bzhl ~]# which nginx /usr/bin/nginx [root@bzhl ~]# strace -c /usr/bin/nginx % time seconds usecs/call calls errors syscall \-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- 22.33 0.001129 7 153 52 open 15.55 0.000786 6 123 close 10.80 0.000546 6 95 mmap 8.53 0.000431 13 32 write 7.66 0.000387 10 39 read 6.47 0.000327 7 48 mprotect 5.38 0.000272 12 22 munmap 4.35 0.000220 3 87 fstat 3.20 0.000162 32 5 nanosleep 2.87 0.000145 8 19 socket 2.67 0.000135 4 38 pread64 2.29 0.000116 29 4 4 connect 1.19 0.000060 4 15 15 bind 1.03 0.000052 3 16 5 stat 1.03 0.000052 9 6 getdents 0.99 0.000050 3 15 setsockopt 0.65 0.000033 11 3 openat 0.63 0.000032 2 15 ioctl 0.63 0.000032 5 6 6 mkdir 0.47 0.000024 2 12 fcntl 0.16 0.000008 8 1 statfs 0.14 0.000007 7 1 1 readlink 0.10 0.000005 5 1 epoll_create 0.08 0.000004 2 2 rt_sigaction 0.08 0.000004 2 2 uname 0.08 0.000004 2 2 gettimeofday 0.08 0.000004 4 1 futex 0.06 0.000003 3 1 poll 0.06 0.000003 3 1 lseek 0.06 0.000003 2 2 getrlimit 0.06 0.000003 3 1 getppid 0.06 0.000003 3 1 sched_getaffinity 0.04 0.000002 1 2 brk 0.04 0.000002 2 1 rt_sigprocmask 0.04 0.000002 2 1 getuid 0.04 0.000002 2 1 arch_prctl 0.04 0.000002 2 1 set\_tid\_address 0.04 0.000002 2 1 set\_robust\_list 0.02 0.000001 1 1 geteuid 0.00 0.000000 0 1 1 access 0.00 0.000000 0 1 execve \-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- 100.00 0.005055 779 84 total 上面的结果将清楚地告诉我们调用了哪些系统函数,调用的次数是多少,消耗了多少时间等信息,这对我们分析程序来说是非常有用的。 重定向输出 strace -c -o tongji.log /application/nginx/sbin/nginx #用 -o 选项将strace的结果输出到文件中 对系统调用进行计时 strace -T /application/nginx/sbin/ngirnx #<=使用选项-T将每个系统调用所花费的时间打印出来,每个调用的时间花费在调用行最右边的尖括导里面。 小结:strace命令很适合处埋程序僵尸、命令执行报错等问题,如果从程序日志和系统日志中看不出问题出现的原因,则可以strace一下,也许会有答案,不过也需要使用者有足够的耐心去查看输出! ltrace:跟踪进程调用库函数ltrace 能够跟踪进程的库函数调用 ,它会显现出调用了哪个库函数,而 strace则是跟踪进程的每个系统调用 。 ltrace命令的参数选项及说明-c 统计库函数每次调用的时间,最后程序退出时打印摘要 -C 解码低级别名称(内核级)为用户级名称 -d 打印调试信息 -e expr 输出过滤器,通过表达式,可以过滤掉你不想要的输出 -e printf 表示只查看printf函数调用 -e !printf 表示查看除printf函数以外的所有函数调用 -f 跟踪子进程 -o filename 将ltrace的输出写入文件filename -p pid 指定要跟踪的进程pid -r 输出每一个调用的相对时间 -S 显示系统调用 -t 在输出中的每一行前加上时间信息。例如16:45:28 -tt 在输出中的每一行前加上时间信息,精确到微秒。例如11:18:59.759546 -ttt 在输出中的每一行前加上时间信息,精确到微秒,而且时间表示为UNIX时间截。例如1486111461.650434 -T 显示每次调用所花费的时间 -u username 以username的UID和GID执行所跟踪的命令 Itrace使用ltrace的用法与strace非常相似,选项功能也是类似[root@bzhl ~]# ltrace /usr/bin/nginx # 提示: -bash: ltrace: command not found # 则:yum -y install ltrace #通过pid 跟踪进程调用库函数。 [root@bzhl ~]# pgrep nginx 1884 7785 7786 7787 [root@bzhl ~]# ltrace -p 1884
2023年11月21日
16 阅读
0 评论
0 点赞
1
...
54
55
56
...
157