首页
学习
活动
专区
圈层
工具
发布

mysql让表只读的语句

在MySQL中,如果你想让一个表变为只读,可以使用ALTER TABLE语句配合LOCK=READ ONLY选项。这样设置后,当前会话可以读取表中的数据,但不能进行写操作(如插入、更新或删除)。其他会话仍然可以对表进行读写操作。

语法

代码语言:txt
复制
ALTER TABLE table_name LOCK=READ ONLY;

示例

代码语言:txt
复制
ALTER TABLE users LOCK=READ ONLY;

优势

  1. 数据保护:在某些情况下,如备份、数据迁移或审计时,你可能希望防止对表进行意外的修改。
  2. 并发控制:允许多个读操作同时进行,但阻止写操作,这在某些高并发读取的场景中是有利的。

应用场景

  • 数据备份:在执行备份操作时,确保数据不会被修改。
  • 数据迁移:在从一个数据库迁移到另一个数据库时,防止数据在迁移过程中被更改。
  • 系统维护:在进行系统维护或升级时,确保数据的完整性。

注意事项

  • 会话限制:只读锁定仅对当前会话有效。一旦会话结束,锁定也会被释放。
  • 性能影响:虽然读操作通常不会受到太大影响,但长时间持有读锁可能会影响数据库的整体性能,特别是当有其他会话等待写操作时。
  • 解锁:要解除表的只读状态,可以使用UNLOCK TABLES命令,或者关闭并重新打开数据库连接。

解决常见问题

问题:为什么设置了只读后,某些写操作仍然可以执行?

原因

  • 可能是因为当前的会话已经持有了表的读锁,但其他会话不受此限制。
  • 或者是因为在执行ALTER TABLE语句时没有正确使用LOCK=READ ONLY选项。

解决方法

  • 确保在执行ALTER TABLE语句时正确指定了LOCK=READ ONLY选项。
  • 如果需要确保整个数据库实例的只读状态,可以考虑使用FLUSH TABLES WITH READ LOCK命令,但这将锁定整个数据库实例的所有表。

参考链接

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MySQL常用表结构查询语句

在我们使用数MySQL据库进行查询或者建表时,经常需要查看表结构,下面以employees数据库中的departments表为例进行表结构查询: 方法 1:DESC departments; 方法 2:...DESCRIBE departments; 方法 3:SHOW COLUMNS FROM departments; 以上三种方法的查询结果相同: Field      Type          Null...Key  Default  Extra dept_no    char(4)      NO    PRI dept_name  varchar(40)  NO    UNI 方法 4: 借用MySQL...自身的information_schema数据库,输入如下指令: --  方法4 SELECT * FROM information_schema.COLUMNS WHERE table_schema...方法4简化版(需要处于 information_schema数据库内) SELECT * FROM COLUMNS WHERE table_name = 'departments'; 查询结果如下: mysql

8K10
  • 技术分享 | MySQL 存储过程中的只读语句超时怎么办?

    作者:杨涛涛资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。...---MySQL 有一个参数叫 max_execution_time ,用来设置只读语句执行的超时时间,但是仅对单独执行的 select 语句有效;对于非单独执行的 select 语句,比如包含在存储过程..., maximum statement execution time exceeded或者是采用直接加 Hint 的方式,也能限制 select 语句的执行时间: 下面两种方式都能起到限制 select...语句执行时间的作用。...既然 MySQL 层面有这样的限制,那只能从非 MySQL 层面来想办法。最直接有效的就是写个脚本来主动 cancel 掉 select 语句。

    2K20

    技术分享 | MySQL 存储过程中的只读语句超时怎么办?

    作者:杨涛涛 资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。...---- MySQL 有一个参数叫 max_execution_time ,用来设置只读语句执行的超时时间,但是仅对单独执行的 select 语句有效;对于非单独执行的 select 语句,比如包含在存储过程...那对这种非单独出现的 select 语句,该如何控制超时时间呢? 先来看下参数 max_execution_time 设置后的效果。...select 语句执行时间的作用。...既然 MySQL 层面有这样的限制,那只能从非 MySQL 层面来想办法。最直接有效的就是写个脚本来主动 cancel 掉 select 语句。

    1.9K30

    只读表空间的备份与恢复

    --====================== --  只读表空间的备份与恢复 --====================== 一、只读表空间的特性     使用只读表空间避免对静态数据的频繁备份...可以清除只读表空间的对象 二、只读表空间的备份     一般情况下,只读表空间只需要进行一次备份,即当表空间状态发生改变时应立即进行备份     可以使用OS系统cp命令来备份或RMAN进行备份只读表空间...online 将只读表空间联机 四、演示只读表空间变化的恢复过程      1....表空间置为只读后将减少数据的备份量     2. 表空间置为只读后,不能对其中的对象执行任何DML操作     3....只读表空间内的对象可以被清除,因为drop命令更新了数据字典,而不更新对象本身     4. 当表空间的状态发生变化时,应立即备份该表空间,以减少恢复工作     5.

    1K20

    MySQL库表操作以及简单查询语句

    SQL主要可以分为一下三种类型: DDL(Data Definition Languages)语句:数据定义语句,这些语句定义了不同的数据库、表、列、索引等对象。...这些语句定义了数据库、表、字段、用户的访问权限和安全级别,常用的语句关键字包括grant、revoke 二、库操作 1. 查询数据库: show databases; 2....选择数据库 use testdb; 三、表操作 因为业务层操作内存,MySQL操作磁盘,数据库永远是最先达到性能瓶颈,我们不能把过多的逻辑操作放在数据库上,逻辑操作应该在业务层做。...MySQL只做最核心的CRUD,触发器、存储函数、存储过程等都不会在MySQL上设置,统一迁移到业务层中的服务层做 1....explain:查看SQL语句的执行信息,展示SQL执行的一些关键信息,大致统计一些性能指标,可以查看SQL语句的执行性能 创建表的时候关键字unique会创建索引 就比如我们注册QQ,登录的时候都会到数据库匹配信息

    1.1K41

    追本溯源:Oracle 只读表空间的探索实践

    1将表空间设为只读,可以带来如下好处 1.1 减少数据库备份和恢复时间 对于只读表空间,只需要在第一备份时进行备份,在以后的备份中不需要再对备份过的只读表空间进行备份。...当表空间设置为只读后,在启动和关闭时就不会对只读表空间对应的数据文件进行处理,从而减少了数据库启动和关闭的时间。...1.3 防止对数据的误操作 只读表空间可以限制如下的操作: Insert Update Delete Truncate Create 因为这些操作需要修改数据文件的 block,而对于只读表空间上的表字段的修改...1.4 分区表的数据过期化处理 前提是分区表的每个分区都在单独的表空间上,当对应分区过期后,可以直接将该分区对应的表空间设置为只读,那么对应分区的数据也就不能被修改。...3重建控制文件对只读表空间和临时表空间的影响 3.1 对只读表空间 假如存在一个只读的表空间,那么在重建控制文件之后,read-only 的数据文件会重命名为 MISSING00005 的格式,最后是5

    1.2K30

    追本溯源:Oracle 只读表空间的探索实践

    1 将表空间设为只读,可以带来如下好处 1.1 减少数据库备份和恢复时间 对于只读表空间,只需要在第一备份时进行备份,在以后的备份中不需要再对备份过的只读表空间进行备份。...当表空间设置为只读后,在启动和关闭时就不会对只读表空间对应的数据文件进行处理,从而减少了数据库启动和关闭的时间。...1.3 防止对数据的误操作 只读表空间可以限制如下的操作: Insert Update Delete Truncate Create 因为这些操作需要修改数据文件的 block,而对于只读表空间上的表字段的修改...1.4 分区表的数据过期化处理 前提是分区表的每个分区都在单独的表空间上,当对应分区过期后,可以直接将该分区对应的表空间设置为只读,那么对应分区的数据也就不能被修改。...3 重建控制文件对只读表空间和临时表空间的影响 3.1 对只读表空间 假如存在一个只读的表空间,那么在重建控制文件之后,read-only 的数据文件会重命名为 MISSING00005 的格式,最后是

    2.5K30

    MySQL建库、表、增删改查语句Demo

    本页目录 库语句 建库 修改库字符集 指定库排序规则 当前库状态的建表语句 删除库 Navicat编辑数据库时执行的SQL 表语句 建表 添加字段 修改表 修改字段 修改表字符集、排序规则 截断表 删除表...添加索引 一直都是用MySQL可视化工具,几乎没碰过建库、表等语句了。...库语句 建库 -- 数据库配置文件default-character-set是utf8_mb3,则会导致创建的表是utf8mb3。...-- 指定库的排序规则 ALTER DATABASE `school` COLLATE 'utf8mb4_bin' 当前库状态的建表语句 -- 查看建表语句 SHOW CREATE DATABASE...直接执行就行,没有参数 SELECT @@character_set_database, @@collation_database 表语句 建表 添加字段 修改表 修改字段 修改表字符集、排序规则 截断表

    7K40

    MySQL DML语句insert全表数据添加语句以及注意事项

    MySQL DML语句insert全表数据添加语句以及注意事项 官方语法: INSERT  INTO  表名 [(字段名列表)]  VALUES (值列表); 字段名是可选的,如省略则依次插入所有字段...多个列表和多个值之间使用逗号分隔 值列表和字段名列表逐一对应 如插入的是表中部分数据,字段名列表必填 全表语法: INSERT  INTO  表名  VALUES (值列表); 需要添加表中所有的数据列信息...NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; DML示例: # 一个井号是注释的意思...2、由于我们没有独立的写列信息,故而添加值数量一定与列数匹配 3、数字类型直接写,而字符/字符串类型以及时间类型需要使用单引号包括 4、要输入中文,其数据库编码集一定为utf8,排序规则【utf8..._general_ci】 5、确认关键字insert into ,values,显示颜色为蓝色,否则书写错误 6、每一条sql语句结束都需要添加一个【;】代表书写完毕。

    1.2K10

    Mysql查询语句之连表查询和增删改查语句补充

    查询 我们的数据是这样的。 ? 发现class_id是一个数字,这是因为我们在设计时,将学生表和班级表分开设计的。 ? 但是如果我们偏偏想要查询这个人是几班的,怎么办?...方式二,left连表 通过where连表固然简单,但是缺点明显。 因为我们的where后面是要跟判断条件的,使用where进行连表会造成逻辑有些混乱。...在一般连表操作中,使用的也是left进行连表。...其实这和where连表是一样的。 方式三,inner连表 inner和left是差不多的,只不过left是正向连表,inner是反向连表。 就像学生表和课程表。...总结 这章有点像收尾部分,补充了连表查询,后续又补充了Mysql的增删改查。 连表查询要区分一下left和inner的区别,一个是正向连,一个是反向连。

    3.5K40

    DBA大牛告诉你,如何让MySQL语句执行加速?

    一打开科技类论坛,最常看到的文章主题就是MySQL性能优化了,为什么要优化呢?...如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not exist 的子查询依然能用到表上的索引。...# 子查询优化 1)MySQL 5.6 之前的版本对子查询处理:不会将查询的结果集计算出来用作与其他表做join,outer表每扫描一条数据,子查询都会被重新执行一遍。...2)MySQL 5.6 对子查询的处理 :将子查询的结果集 cache 到临时表里,临时表索引主要用来移除重复记录,并且随后也可能用于做join查询,这种技术在 5.6 中叫做物化的子查询,物化子查询可以看到...image.png # straight_join mysql hint:mysql 优化器在处理多表的关联的时候,很有可能会选择错误的驱动表进行关联,导致了关联次数的增加,从而使得sql语句执行变得非常的缓慢

    1.2K20

    MySQL语句的语法

    |符号用来指出几个选择中的一个,因为NULL |NOT NULL 表示或者给出NULL或者给出NOT NULL 包含在防括号中的关键字或者子句(如[like this])是可选的 ALTER TABLE...用来更新已存在的表的模式 CREATE TABLE 用来创建新的表的模式 COMMIT 用来将事务处理写到数据库 CREATE INDEX 用来在一个或者多个列上创建索引 CREATE PROCEDURE...用于创建存储过程 CREATE USER 用于向系统中添加新的用户账户 CREATE VIEW 用来创建一个或多个表上的新视图 DELETE 从表中删除一行或者多行 DROP 永久地删除数据库对象(表、...SELECT的结果到一个表 ROLLBACK用于撤销一个事务处理块 SAVEPOINT为使用ROLLBACK语句设立保留点 SELECT用于一个或多个表(视图)中检索数据 START TRANSACTION...表示一个新的事务处理块的开始 UPDATE 更新表中一行或者多行

    1.7K20
    领券