[TOC]
数据库命令
MySQL 查询命令详解(针对初学者)
以下是每个查询命令的详细参数说明,帮助您理解每个关键字的作用:
| 关键字/参数 | 作用 | 语法说明 | 示例值 | 解释说明 |
|---|---|---|---|---|
| SELECT | 选择要显示的列 | SELECT 列名 AS 别名 | SELECT A.emp_name AS 姓名 | 决定查询结果中显示哪些数据 |
| AS | 为列或表指定别名 | 原始名 AS 别名 | A.emp_name AS 姓名 | 给列或表起一个更易读的名称 |
| FROM | 指定数据来源的表 | FROM 表名 AS 别名 | FROM employee AS A | 告诉数据库从哪个表获取数据 |
| JOIN | 连接其他表 | JOIN 表名 AS 别名 ON 条件 | JOIN department AS B | 将多个表的数据关联起来 |
| ON | 指定连接条件 | ON 表1.列 = 表2.列 | ON A.dep_id = B.dep_id | 定义两个表如何关联的规则 |
| WHERE | 过滤条件 | WHERE 条件表达式 | WHERE emp_name='tom' | 筛选满足特定条件的记录 |
| GROUP BY | 分组依据 | GROUP BY 列名 | GROUP BY dep_name | 将数据按指定列分组 |
| ORDER BY | 排序方式 | ORDER BY 列名 [ASC/DESC] | ORDER BY A.age ASC | 按指定列排序结果 |
| LIMIT | 限制返回行数 | LIMIT 行数 | LIMIT 1 | 只返回指定数量的记录 |
| COUNT() | 计算行数 | COUNT(列名) | COUNT(A.emp_name) | 统计记录数量 |
| SUM() | 计算总和 | SUM(数值列) | SUM(A.age) | 计算数值列的总和 |
| AVG() | 计算平均值 | AVG(数值列) | AVG(A.age) | 计算数值列的平均值 |
| LEFT JOIN | 左连接 | LEFT JOIN 表名 ON 条件 | LEFT JOIN department AS B | 包含左表所有记录,即使右表无匹配 |
| RIGHT JOIN | 右连接 | RIGHT JOIN 表名 ON 条件 | RIGHT JOIN department AS B | 包含右表所有记录,即使左表无匹配 |
特殊符号说明:
| 符号 | 含义 | 示例 | 解释 |
|---|---|---|---|
| . | 表与列的连接符 | A.emp_name | 表示表A的emp_name列 |
| = | 等于比较 | A.dep_id = B.dep_id | 判断两个值是否相等 |
| ’ ‘ | 字符串定界符 | 'it' | 表示文本值 |
| **; ** | 语句结束符 | 每个查询结尾的; | 表示SQL语句结束 |
表名和列名说明:
| 名称 | 类型 | 示例 | 解释 |
|---|---|---|---|
| employee | 表名 | FROM employee | 员工信息表 |
| department | 表名 | JOIN department | 部门信息表 |
| emp_name | 列名 | A.emp_name | 员工姓名字段 |
| dep_name | 列名 | B.dep_name | 部门名称字段 |
| age | 列名 | A.age | 员工年龄字段 |
| dep_id | 列名 | A.dep_id | 部门ID字段 |
别名说明:
| 别名 | 对应表 | 示例 | 解释 |
|---|---|---|---|
| A | employee | employee AS A | 员工表的别名 |
| B | department | department AS B | 部门表的别名 |
| 姓名 | emp_name | A.emp_name AS 姓名 | 员工姓名的显示名称 |
| 部门 | dep_name | B.dep_name AS 部门 | 部门名称的显示名称 |
查询示例详解:
示例1:查询所有人所在的部门名称
SELECT A.emp_name AS 姓名, -- 从员工表选择姓名列,显示为"姓名" B.dep_name AS 部门 -- 从部门表选择部门列,显示为"部门"FROM employee AS A -- 主表是员工表,别名为AJOIN department AS B -- 连接部门表,别名为B ON A.dep_id = B.dep_id; -- 连接条件:员工表的部门ID = 部门表的部门ID示例5:查询哪个员工目前所在的部门还没有成立
SELECT A.emp_name AS 姓名, B.dep_name AS 部门FROM employee AS ALEFT JOIN department AS B -- 左连接:保留所有员工记录 ON A.dep_id = B.dep_idWHERE B.dep_name IS NULL; -- 只显示部门名称为空的记录示例8:查询哪个部门的年龄总和最高
SELECT SUM(A.age) AS 年龄总和, -- 计算年龄总和 B.dep_name AS 部门FROM employee AS AJOIN department AS B ON A.dep_id = B.dep_idGROUP BY B.dep_name -- 按部门分组ORDER BY 年龄总和 DESC -- 按年龄总和降序排序LIMIT 1; -- 只显示第一条记录(最高值)总结:
- SELECT:指定要显示的列。
- FROM:指定数据来源的表。
- JOIN … ON:连接另一个表,并指定连接条件。
- WHERE:过滤行。
- GROUP BY:分组,通常与聚合函数一起使用。
- ORDER BY:排序。
- LIMIT:限制返回的行数。
创建用户
mysql > create【克瑞特】 user '用户名'@'被允许连接的主机名称或主机的IP地址' identified ed by【拜】 '用户密码';mysql > create【克瑞特】 user '用户名'@'被允许连接的主机名称或主机的IP地址' identified ed by '用户密码';查询MySQL服务器中所有用户及其允许连接的主机。
mysql > select【涩莱克特】 user,host from【弗乱】 mysql.user;mysql > select user.host from mysql.user;查看所有数据库信息
SHOW DATABASES;配置远程访问权限
查看 root 用户的权限情况 :
SELECT host, user FROM mysql.user WHERE user = 'root';添加和更新用户权限:
CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY '123';-- **作用**:创建用户账号。-- **说明**:这条命令创建了一个名为 `root` 的用户,并设置其密码为 `123`。`'%'` 表示该用户可以从任何远程主机连接到 MySQL 服务器。命令成功执行,
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;-- **作用**:授予权限。-- **说明**:-- `ALL PRIVILEGES`: 这意味着授予所有数据库的**所有操作权限**,包括 `SELECT`(查询), `INSERT`(插入), `UPDATE`(更新), `DELETE`(删除), `DROP`(删除表)等。-- `WITH GRANT OPTION`: 这表示 `root` 用户**可以将其拥有的权限(这里是所有权限)再授予其他用户**。
FLUSH PRIVILEGES; # 刷新权限使更改生效-- **作用**:重新加载权限表。-- **说明**:MySQL 的权限信息主要存储在 `mysql` 数据库的权限表(如 `user`, `db`, `tables_priv` 等)中。通常,使用 `GRANT`/`REVOKE` 等权限管理语句后,权限会自动更新到内存中,无需手动执行 `FLUSH PRIVILEGES`-- **何时需要**:如果你**直接使用 `INSERT`、`UPDATE` 或 `DELETE` 语句手动修改了权限表**,那么必须执行 `FLUSH PRIVILEGES;` 来通知服务器重新加载权限,使更改生效。在你的操作流程中,这条命令是**多余的,但不是错误的**。
-- 授予root账户对moershi.user表【仅查询】权限 (核心修正)GRANT SELECT ON moershi.user TO 'root'@'%';
-- 1. 撤销该用户在 moershi.user 表上的所有权限REVOKE ALL PRIVILEGES ON moershi.user FROM 'roor'@'%';
-- 2. 撤销其授予权限的能力REVOKE GRANT OPTION ON moershi.user FROM 'roor'@'%';
-- 3. 授予它本应拥有的唯一权限:查询(SELECT)GRANT SELECT ON moershi.user TO 'roor'@'%';解释选项:
'root'@'sfta188299c.sf.com':显式指定客户端主机名(精确匹配)。 GRANT ALL PRIVILEGES:授予完全权限(可根据需求调整,如 GRANT SELECT, INSERT ON database.*)。 IDENTIFIED BY:设置或更新密码(如未定义用户,会创建新用户)。 更安全的替代:如果客户端使用 IP 而非域名,可以用 IP 地址授权(如 'root'@'192.168.99.1'),减少 DNS 依赖。在 MySQL 5.7 中修改 root 用户密码,可以通过以下方法操作:
方法一:在 MySQL 命令行中直接修改
1. 登录后,执行以下命令(替换 新密码 为你要设置的密码):
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';(如果 root 允许远程连接,可能需要同时修改 'root'@'%' 的密码)
2. 刷新权限使修改生效:
FLUSH PRIVILEGES;3. 退出 MySQL 重新登录验证:
exit;方法二:使用 set password 命令
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新密码'); FLUSH PRIVILEGES;方法三:使用 bin/mysqladmin 命令
[root@mysql mysql_3306]# bin/mysqladmin -uroot password '123456' -p #'123456'要设置的密码Enter password: ##旧密码\初始密码mysqladmin: [Warning] Using a password on the command line interface can be insecure.Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.[root@mysql mysql_3306]# bin/mysql -uroot -pEnter password: ##修改后的新密码Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 4Server version: 5.7.31 MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> exitBye[root@mysql mysql_3306]# pwd/mysql_3306注意事项
- 密码需符合 MySQL 的安全策略(默认要求包含大小写字母、数字和特殊字符,长度至少 8 位)。
- 如果后续登录提示密码错误,可检查是否是
'root'@'localhost'和'root'@'%'权限的密码未统一设置。 - 若忘记密码,需通过
--skip-grant-tables方式启动 MySQL 进行重置(此为特殊场景操作)。
修改字符集
修改数据库字符集
-- 修改数据库字符集ALTER DATABASE db_fq CHARACTER SET utf8 COLLATE utf8_general_ci;修改服务器字符集配置
编辑 MySQL 配置文件(通常是 /etc/my.cnf或 /mysql_3306/my.cnf):
[mysqld]character-set-server=utf8collation-server=utf8_general_ci
[client]default-character-set=utf8重启 MySQL 服务:
service mysql_3306 restart验证字符集配置
SHOW VARIABLES LIKE 'character_set%';SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAMEFROM INFORMATION_SCHEMA.SCHEMATAWHERE SCHEMA_NAME = 'db_fq';数据库权限修改
解决方案
您需要为这个新创建的 'root'@'%' 用户授予适当的数据库访问权限:
方案1:授予所有权限(推荐用于管理)
-- 授予所有数据库的所有权限(类似超级用户)GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
-- 刷新权限FLUSH PRIVILEGES;方案2:授予特定数据库的权限
-- 授予特定数据库的所有权限(例如 test 数据库)GRANT ALL PRIVILEGES ON test.* TO 'root'@'%';
-- 刷新权限FLUSH PRIVILEGES;方案3:授予只读权限(更安全)
-- 授予所有数据库的只读权限GRANT SELECT ON *.* TO 'root'@'%';
-- 刷新权限FLUSH PRIVILEGES;验证权限
授予权限后,您可以验证用户的权限:
-- 查看用户权限SHOW GRANTS FOR 'root'@'%';安全建议
虽然使用 root 作为远程用户名很方便,但从安全角度考虑,我建议:
- 创建专用管理账户:
CREATE USER 'admin_remote'@'%' IDENTIFIED BY '复杂密码';GRANT ALL PRIVILEGES ON *.* TO 'admin_remote'@'%' WITH GRANT OPTION;FLUSH PRIVILEGES;- 限制访问来源(更安全):
-- 只允许从特定IP段连接CREATE USER 'admin_remote'@'192.168.88.%' IDENTIFIED BY '复杂密码';GRANT ALL PRIVILEGES ON *.* TO 'admin_remote'@'192.168.88.%';FLUSH PRIVILEGES;总结
您遇到的问题是因为新创建的 'root'@'%' 用户还没有被授予访问普通数据库的权限。只需要执行相应的 GRANT 语句即可解决。
建议操作:
-- 在每台MySQL服务器上执行GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;FLUSH PRIVILEGES;执行后,您再用这个账户远程连接,就能看到所有数据库了。
因GTID 不一致导致复制中断,无法同步从库
-
all.sql备份文件包含了 GTID 信息:- 当您导入
all.sql时,它可能包含SET @@GLOBAL.GTID_PURGED语句 - 这会修改主库的 GTID 执行历史,但与从库的 GTID 历史不匹配
- 从库检测到 GTID 不一致,会停止复制或跳过这些事务
- 当您导入
-
moershi.sql可能不包含 GTID 信息:- 这个文件可能是使用
--set-gtid-purged=OFF选项生成的 - 或者是一个不包含 GTID 信息的传统备份
- 因此导入后不会影响 GTID 一致性,复制可以正常进行
- 这个文件可能是使用
解决方案
请按照以下步骤彻底解决这个问题:
方案1:完全重置 GTID(推荐)
这是最彻底的解决方案,但需要在维护窗口进行:
# 1. 停止所有从库复制mysql -uroot -p -e "STOP SLAVE;"
# 2. 在主库上重置 GTID 信息(会清除所有二进制日志)mysql -uroot -p -e "RESET MASTER;"
# 3. 重新导入清理后的备份文件sed -i '/SET @@GLOBAL.GTID_PURGED/d' all.sqlmysql -uroot -p < all.sql
# 4. 在从库上重新配置复制mysql -uroot -p -e "STOP SLAVE;RESET SLAVE ALL;CHANGE MASTER TO MASTER_HOST='192.168.88.10', MASTER_USER='slave', MASTER_PASSWORD='123', MASTER_AUTO_POSITION=1;START SLAVE;"
# 5. 检查复制状态mysql -uroot -p -e "SHOW SLAVE STATUS\G" | grep -E 'Slave_IO_Running|Slave_SQL_Running'方案2:手动跳过冲突的 GTID
如果不想完全重置,可以尝试跳过冲突的 GTID:
-- 在从库上执行STOP SLAVE;SET GLOBAL sql_slave_skip_counter = 1;START SLAVE;或者对于 GTID 复制:
-- 在从库上执行STOP SLAVE;SET GTID_NEXT='冲突的GTID编号';BEGIN; COMMIT;SET GTID_NEXT='AUTOMATIC';START SLAVE;方案3:重新生成正确的备份文件
最好的长期解决方案是重新生成不包含 GTID 信息的备份:
# 在主库上重新生成备份mysqldump --single-transaction --set-gtid-purged=OFF -u root -p --databases db_fq db_it db_my test1 > all_new.sql
# 导入新备份mysql -uroot -p < all_new.sql验证和确认
执行解决方案后,请验证:
-
检查主库数据库:
Terminal window mysql -uroot -p -e "SHOW DATABASES;" -
检查从库复制状态:
Terminal window mysql -uroot -p -e "SHOW SLAVE STATUS\G" | grep -E 'Slave_IO_Running|Slave_SQL_Running' -
检查数据同步:
Terminal window # 在主库上创建测试数据mysql -uroot -p -e "USE test1; CREATE TABLE IF NOT EXISTS sync_test (id INT); INSERT INTO sync_test VALUES (1);"# 在从库上检查mysql -uroot -p -e "USE test1; SELECT * FROM sync_test;"
预防措施
为了避免未来出现类似问题:
-
使用正确的备份选项:
Terminal window # 生成用于主从环境的备份mysqldump --single-transaction --set-gtid-purged=OFF -u root -p --databases your_database > backup.sql -
定期检查 GTID 一致性:
-- 在主库上执行SHOW GLOBAL VARIABLES LIKE 'gtid_executed';-- 在从库上执行SHOW GLOBAL VARIABLES LIKE 'gtid_executed'; -
监控复制状态:
Terminal window # 定期检查复制状态mysql -uroot -p -e "SHOW SLAVE STATUS\G" | grep -E 'Slave_IO_Running|Slave_SQL_Running|Seconds_Behind_Master'
总结
您遇到的问题是由于 all.sql 备份文件包含 GTID 信息,导致主从库的 GTID 历史不一致,从而阻止了复制。而 moershi.sql 不包含 GTID 信息,所以能够正常同步。
推荐解决方案:使用方案1完全重置 GTID,这是最彻底的方法。如果您需要更详细的指导或在执行过程中遇到问题,请随时告诉我!
关闭/降低数据库密码策略等级
完全卸载密码验证组件
1. 登录 MySQL:
mysql -uroot -p2. 检查并卸载密码验证组件:
-- 初次登录需要复杂密码ALTER USER 'root'@'localhost' IDENTIFIED BY 'Password123!';
-- 查看已安装的组件SELECT * FROM mysql.component;
-- 卸载密码验证组件UNINSTALL COMPONENT 'file://component_validate_password';
-- 再次检查密码验证相关变量SHOW VARIABLES LIKE 'validate_password%';3. 现在尝试修改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '123';mysql 密码强度设置
validate_password_policy=0
- 含义:设置密码策略的安全级别
- 可选值:
0/LOW:只检查密码长度1/MEDIUM:长度 + 数字 + 大小写字母 + 特殊字符(默认值)2/STRONG:在 MEDIUM 基础上增加字典文件检查
validate_password_length=4
- 含义:设置密码的最小长度要求
- 默认值:通常是
8
相关参数说明(扩展)
| 参数 | 含义 | 默认值 | 说明 |
|---|---|---|---|
validate_password_number_count | 最少数字数量 | 1 | 密码中至少包含的数字个数 |
validate_password_mixed_case_count | 最少大小写字母数量 | 1 | 至少需要的大小写字母总数 |
validate_password_special_char_count | 最少特殊字符数量 | 1 | 如 !@#$%等符号的数量要求 |
validate_password_dictionary_file | 字典文件路径 | 空 | 强策略下检查密码是否在字典中 |
| validate_password_policy | 设置密码策略的安全级别 | ||
| **`validate_password_length=4 | 设置密码的最小长度要求 |
正确做法(生产环境)
[mysqld]# 保持中等或强密码策略validate_password_policy=1 # 或 2
# 建议最小长度12+validate_password_length=12
# 增强要求(可选)validate_password_mixed_case_count=2 # 至少2个大小写字母validate_password_special_char_count=1 # 至少1个特殊符号合规密码示例:MyDB@Pass123!
如何生效?
-
修改配置文件(如
/etc/my.cnf) -
重启MySQL服务:
systemctl restart mysqld -
验证配置:
SHOW VARIABLES LIKE 'validate_password%';
密码忘记
# 修改主配置文件# 手动添加此行 作用登陆时不验证密码[root@mysql50 ~]# vim /etc/my.cnf.d/mysql-server.cnf[mysqld]skip-grant-tables【忒-部s】:wq# 重启服务 作用让服务以新配置运行[root@mysql50 ~]# # systemctl【西斯屯-ctl】 restart【 率 s 达r】 mysqld# 连接服务[root@mysql50 ~]# mysql# 把mysql库下user表中 用户root的密码设置为无;mysql> update mysql.user set authentication_string="" where user="root";Query OK, 1 row affected (0.05 sec)mysql> exit;
# 编辑配置文件# 注释添加的行[root@mysql50 ~]# vim /etc/my.cnf.d/mysql-server.cnf[mysqld]#skip-grant-tables【忒-部s】:wq# 重启服务 作用让注释生效[root@mysql50 ~]# systemctl【西斯屯-ctl】 restart【 率 s 达r】 mysqld# 无密码登陆[root@localhost ~]# mysql# 设置root用户本机登陆密码mysql> alter user root@"localhost" identified by "123";mysql> exit;
总结忘记密码
1. 修改mysql配置文件`vim /etc/my.cnf.d/mysql-server.cnf ``skip-grant-tables 不需要密码验证`
2. 重启mysql服务`systemctl restart mysqld`
3. 无密码登录`mysql`
4. 把密码修改为空`update user set authentication_string="" where user="root";`
5. 修改mysql配置文件`vim /etc/my.cnf.d/mysql-server.cnf `去掉skip-grant-tables
6. 重启mysql服务`systemctl restart mysqld`
7. 无密码登录`mysql`
8. 在mysql终端里面设置密码`alter user root@"localhost" identified by "NSD123456...a"`maccms
//查询select art_id,art_name from maccms.mac_art where art_name like "%sds%";select art_id,art_name from maccms.mac_art where art_name like "%sd%";select art_id,art_name from maccms.mac_art where art_name like "%妈%" or art_name like "%母%" or art_name like "%狗%";select vod_id,vod_name from maccms.mac_vod where vod_name like "%妈%" or vod_name like "%母%" or vod_name like "%狗%";//删除delete from maccms.mac_art where art_name like "%妈%" or art_name like "%母%" or art_name like "%狗%";delete from maccms.mac_vod where vod_name like "%妈%" or vod_name like "%母%" or vod_name like "%狗%";
//导出mysqldump -uroot -p maccms mac_vod --where="vod_name LIKE '%妈%'" > mac_vod.sql
// 第一次导出时包含表结构mysqldump -uroot -p123 maccms mac_vod --where="vod_name like '%妈%' or vod_name like '%母%' or vod_name like '%狗%'" > mac_vod.sql// 后续导出只追加数据,不包含表结构mysqldump -uroot -p123 maccms mac_vod --no-create-info --where="vod_name like '%妈%' or vod_name like '%母%' or vod_name like '%狗%'" >> mac_vod.sql
// 第一次导出时包含表结构mysqldump -uroot -p123 maccms mac_art --where="art_name like '%妈%' or art_name like '%母%' or art_name like '%狗%'" > mac_art.sql// 后续导出只追加数据,不包含表结构mysqldump -uroot -p123 maccms mac_art --no-create-info --where="art_name like '%妈%' or art_name like '%母%' or art_name like '%狗%'" >> mac_art.sql
// 删除mysql -uroot -p123 -e "delete from maccms.mac_art where art_name like '%妈%' or art_name like '%母%' or art_name like '%狗%';"mysql -uroot -p123 -e "delete from maccms.mac_vod where vod_name like '%妈%' or vod_name like '%母%' or vod_name like '%狗%';"vim export_and_delete.sh
#!/bin/bash
# 数据库配置DB_USER="root"DB_PASSWORD="123"DB_NAME="maccms"
# 导出文件路径VOD_FILE="mac_vod.sql"ART_FILE="mac_art.sql"
# 创建日志函数log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"}
# 检查并执行 mac_vod 表的导出if [ ! -f "$VOD_FILE" ]; then log "首次导出 mac_vod 表(包含表结构)" mysqldump -u$DB_USER -p$DB_PASSWORD $DB_NAME mac_vod --where="vod_name like '%妈%' or vod_name like '%母%' or vod_name like '%狗%'" > $VOD_FILEelse log "追加导出 mac_vod 表数据" mysqldump -u$DB_USER -p$DB_PASSWORD $DB_NAME mac_vod --no-create-info --where="vod_name like '%妈%' or vod_name like '%母%' or vod_name like '%狗%'" >> $VOD_FILEfi
# 检查并执行 mac_art 表的导出if [ ! -f "$ART_FILE" ]; then log "首次导出 mac_art 表(包含表结构)" mysqldump -u$DB_USER -p$DB_PASSWORD $DB_NAME mac_art --where="art_name like '%妈%' or art_name like '%母%' or art_name like '%狗%'" > $ART_FILEelse log "追加导出 mac_art 表数据" mysqldump -u$DB_USER -p$DB_PASSWORD $DB_NAME mac_art --no-create-info --where="art_name like '%妈%' or art_name like '%母%' or art_name like '%狗%'" >> $ART_FILEfi
# 删除数据库中的对应数据log "删除数据库中符合条件的数据"mysql -u$DB_USER -p$DB_PASSWORD -e "DELETE FROM $DB_NAME.mac_vod WHERE vod_name like '%妈%' or vod_name like '%母%' or vod_name like '%狗%';"mysql -u$DB_USER -p$DB_PASSWORD -e "DELETE FROM $DB_NAME.mac_art WHERE art_name like '%妈%' or art_name like '%母%' or art_name like '%狗%';"
log "操作完成"
chmod +x export_and_delete.shbash export_and_delete.sh
crontab -e0 6 * * * /root/maccms/sql/export_and_delete.sh >> /root/maccms/sql/export_log.txt 2>&1