orczhou.com

  • 首页
  • 云数据库性能测试与对比
    • RDS MySQL 性能
    • RDS PostgreSQL 性能
    • AWS RDS架构与选型
    • 阿里云RDS架构与选型
    • 阿里云ARM/x86 RDS
    • 华为云鲲鹏/x86 RDS
    • AWS Graviton/x86
  • 关于MySQL
    • <高性能MySQL>
    • 如何学习MySQL
    • MySQL 版本选择
    • MySQL 版本历史
  • 其他
    • LLM 与 AI 技术
    • 数据库行业动态
    • 关于生活
    • 归档页面
    • 管理页面
    • 关于作者
  • 理解 MySQL 隐式主键

    2025-03-16

    隐式主键是 MySQL 8.0 版本新增的一个重要特性。可以非常好的解决了诸如无主键大表更新时的主备延迟问题,大大提升了主备高可用架构的“可用性”。

    为什么需要隐式主键

    最早不得不引入隐式主键功能的,大概是云厂商。

    很早,在 MySQL 运维的过程中就发现了有一类复制延迟问题,非常难缠。当主库的表没有主键/唯一键时,在主库使用一条 UPDATE 或 DELETE操作了大量记录,在使用ROW模式的备库中,则会收到对应的、大量的变更记录,而这些变更记录在备库上应用(apply)时,因为没有主键或者唯一索引,每一条变更的回放都需要很长时间,最终导致主备之间无法追上的延迟。

    所以,在很早的时候,MySQL 规范中就有一条,表必须要有主键。对于企业,也许可以通过规范,或者调整表结构去绕开这个问题,但是,对于提供数据库托管服务的云厂商来说,却没法去要求上面使用数据库的用户去做任何适配。但是,云厂商有需要为这些数据库服务提供基于主备的高可用能力。这就陷入了一个困境,这也是为什么云厂商可能是最早需要解决这个问题的。

    早在 2016 年,阿里云的 RDS 就已经通过引入隐式主键解决类似的问题:MySQL · 最佳实践 · RDS 只读实例延迟分析。

    MySQL的实现方案

    相比于社区的实现,MySQL 官方的实现考虑的更加全面,首先引入不可见列、不可见索引等特性,然后再在此基础上实现隐式主键,也全面的考虑对历史版本的兼容性、对复制的影响、对备份的影响、对各类操作命令的影响等。

    在 MySQL 8.0.30 版本(2022年07月)中,官方MySQL正式引入了隐式主键的功能。对于所有没有显式主键的 InnoDB 表,都会新增一个如下的隐式主键:

    my_row_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT INVISIBLE PRIMARY KEY

    所以,甚至在你新建一个 InnoDB 表时,如果你没有显式的主键,那么字段名 my_row_id就不能再使用了。也因为该版本是通过 INVISIBLE COLUMN 实现的,所以可以通过ALTER TABLE t1 CHANGE COLUMN...命令将隐式主键转换为普通列。

    打开隐式主键功能

    • 在 MySQL 中可以通过配置参数 sql_generate_invisible_primary_key 是否开启隐式主键功能。
    • 参数 show_gipk_in_create_table_and_information_schema 则可以控制在SHOW以及 information_schema中是否展示隐式主键信息,该参数可以帮助使用SHOW以及 information_schema的应用程序,依旧保持很好的兼容性。

    其他相关的参数包括:

    • sql_require_primary_key :该参数可以强制要求数据库中的表尽量有主键。例如,创建表、ALTER表时都需要表有主键;删除表的主键失败等,总之,尽可能的要求表均有主键。
    • REQUIRE_TABLE_PRIMARY_KEY_CHECK 这是复制配置时的选项,该参数控制的是复制时的应用线程(apply)如何检查表是否有主键,该选项的取值为:{STREAM | ON | OFF | GENERATE}。该参数可以很好的控制,从主库复制过来的表,对主键配置的要求。

    DDL 、复制与Binlog

    如果MySQL开启了隐式主键,那么就像invisible column一样,CREATE TABLE、ALTER TABLE的创建的隐式主键也会存储在 Binlog 中,所以备库如果在复制时,也可以活动对应的信息。

    mysql> set session sql_generate_invisible_primary_key=ON;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> create table t1_no_pk(n char(10),age int);
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> show create table t1_no_pk\G
    *************************** 1. row ***************************
           Table: t1_no_pk
    Create Table: CREATE TABLE `t1_no_pk` (
      `my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT /*!80023 INVISIBLE */,
      `n` char(10) DEFAULT NULL,
      `age` int DEFAULT NULL,
      PRIMARY KEY (`my_row_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    1 row in set (0.00 sec)

    再来使用mysqlbinlog命令看看对应 binlog格式:

    # at 653
    #250316 15:02:05 server id 1  end_log_pos 928 CRC32 0x9ca72462 	Query	thread_id=9	exec_time=0	error_code=0	Xid = 31
    SET TIMESTAMP=1742108525/*!*/;
    /*!80013 SET @@session.sql_require_primary_key=0*//*!*/;
    CREATE TABLE `t1_no_pk` (
      `my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT /*!80023 INVISIBLE */,
      `n` char(10) DEFAULT NULL,
      `age` int DEFAULT NULL,
      PRIMARY KEY (`my_row_id`)
    )
    /*!*/;
    SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
    DELIMITER ;
    # End of log file
    /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

    参考阅读

    • Generated Invisible Primary Keys@MySQL Documentation
    • Generated Invisible Primary Keys (GIPKs)@Changes in MySQL 8.0.30 (2022-07-26, General Availability)
    • Generated Invisible Primary Key@The Oracle MySQL Blog
    • 15.1.20.10 Invisible Columns
    • mysqldump 参数 –skip-generated-invisible-primary-key
    • REQUIRE_TABLE_PRIMARY_KEY_CHECK

  • 云数据库行业动态@2025-03-14

    2025-03-14

    标题:NineData 社区版发布支持免费数据库增量迁移;IDC报告中国2024H1分布式数据库市场规模3.6亿美元.

    重要更新

    NineData 发布“社区版”,向开发者、以及小型企业提供免费的数据库迁移、同步、SQL审核等功能,该版本基于Docker 安装,可视化操作。[2]

    IDC 发布2024H1-中国分布式数据库市场报告,上半年市场规模为 3.6 亿美元,同比增长18.5%。其中,本地部署规模为1.4亿美元;公有云市场规模2.2亿美元。[1][3]

    更新详情

    百度云

    VectorDB 支持可视化工具进行管理[24]
    VectorDB CLI 2.1 版发布,支持 RBAC 操作[25]

    腾讯云
    • 云数据库 MySQL 数据库审计支持日志投递至 Ckafka 消息队列/CLS [28]
    • 云数据库 MySQL 5.7内核版本更新20240702。[31]
    • ((2025-03-06)) 云数据库 MySQL 发布数据库代理版本1.3.16。[32]
    火山云(字节)
    • 云数据库 PostgreSQL 版新增扩展 pg_bigm 、pg_ivm [21][22]
    • 云数据库 PostgreSQL 新增支持 Pulumi 进行资源管理[23]
    • 托管Redis、MongoDB、PostgreSQL等新增在亚太东南(雅加达)开服
    Azure(微软云)
    • Azure Database for PostgreSQL 支持新西兰北部区域 [5]
    • Azure Advisor 增强了 Azure Database for PostgreSQL 性能优化能力[6]
    • Azure 数据工厂发布Azure Database for PostgreSQL 连接器版本 2.0版本 [7]
    • 基于 vCore 的 Azure Cosmos DB for MongoDB 入门级 (M10/M20)实例正式上线 [8]
    • MongoDB 上基于 vCore 的 Azure Cosmos DB 的自动缩放功能 GA [9]
    • Azure Database for PostgreSQL 支持 pg_repack 1.5.1、tdigest、postgresql-hll、Topn [10][11][12][13]
    Oracle云
    • HeatWave:支持跨区域自动备份[14]
    • Autonomous Data Guard 配置中支持双备用数据库 [16]
    AWS(亚马逊云)
    • Aurora PostgreSQL 与 Redshift 的zero-ETL 集成现支持多种集成 [18]
    • DynamoDB 与 Redshift 的 zero-ETL 集成支持更多区域 [19]
    • Neptune 数据库现在支持 R7i 实例 [20]

    参考链接

    • [1] https://mp.weixin.qq.com/s/mpCtbPuoiwae_BUgCIdE_w
    • [2] https://mp.weixin.qq.com/s/FjdgfDw9em7X6EXxyjxNdg
    • [3] https://www.idc.com/getdoc.jsp?containerId=prCHC53217425
    • [5] https://azure.microsoft.com/updates?id=483702
    • [6] https://azure.microsoft.com/updates?id=483697
    • [7] https://azure.microsoft.com/updates?id=483692
    • [8] https://azure.microsoft.com/updates?id=483629
    • [9] https://azure.microsoft.com/updates?id=483616
    • [10] https://azure.microsoft.com/updates?id=481996
    • [11] https://azure.microsoft.com/updates?id=481991
    • [12] https://azure.microsoft.com/updates?id=481982
    • [13] https://azure.microsoft.com/updates?id=481965
    • [14] https://docs.oracle.com/iaas/releasenotes/mysql-database/heatwave-copy-autobackup.htm
    • [16] https://docs.oracle.com/iaas/releasenotes/autonomous-database-dedicated/adbd-audg-secondstandby.htm
    • [18] https://aws.amazon.com/about-aws/whats-new/2025/03/amazon-aurora-postgresql-zero-etl-integration-redshift-multiple-integrations
    • [19] https://aws.amazon.com/about-aws/whats-new/2025/03/amazon-dynamodb-zero-etl-integration-redshift-additional-regions
    • [20] https://aws.amazon.com/about-aws/whats-new/2025/03/amazon-neptune-database-r7i-instances/
    • [21] https://www.volcengine.com/docs/6438/1465372
    • [22] https://www.volcengine.com/docs/6438/1473804
    • [23] https://www.volcengine.com/docs/6438/1476192
    • [24] https://cloud.baidu.com/doc/VDB/s/Cm7bly8u6
    • [25] https://cloud.baidu.com/doc/VDB/s/Em1zvj00h
    • [28] https://cloud.tencent.com/document/product/236/106893
    • [31] https://cloud.tencent.com/document/product/236/90320
    • [32] https://cloud.tencent.com/document/product/236/89741
  • 我的 Docker 常见命令

    2025-03-09

    目录

    • 查看当前容器列表
    • 启动/关闭/重启某个容器
    • 查看容器的运行日志
    • 在容器中执行命令
    • 进入容器并启动一个Bash
    • 将容器中的文件拷贝到宿主机
    • 查看当前的本地的镜像列表
    • 其他资源

    查看当前容器列表

    docker ps -a

    可能看到输出如下:

    docker ps -a
    Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
    CONTAINER ID  IMAGE                                                     COMMAND     CREATED       STATUS                   PORTS       NAMES
    c84f74eedd65  container-registry.oracle.com/mysql/community-server:9.1  mysqld      5 months ago  Exited (0) 4 months ago              mysql91
    13985429990f  container-registry.oracle.com/mysql/community-server:9.1  mysqld      2 months ago  Created                              mysql91_n

    启动/关闭/重启某个容器

    docker start/stop/restart <CONTAINER NAMES>
    docker start/stop/restart <CONTAINER ID>

    例如:

    docker start mysql91

    查看容器的运行日志

    docker logs -f <CONTAINER ID>

    这里的参数 -f则类似于 tail的-f的参数。

    在容器中执行命令

    docker exec -it <CONTAINER NAMES> COMMAND

    例如

    docker exec -it mysql91 mysql -uroot -p

    这里参数,可以通过 man docker exec去查看。-it是两个参数,表示分配一个可交互式操作的终端。

    进入容器并启动一个Bash

    类似的,使用上面的命令,可以在容器环境下启动一个Bash:

    docker exec -it mysql91 /bin/bash

    将容器中的文件拷贝到宿主机

    有时候,在容器中,工具和命令比较有限,需要将对应的容器中的文件拷贝出来并进行分析或存档。则可以使用如下命令:

    docker cp <CONTAINER NAMES>:<PATH_OF_FILE> <PATH_OF_HOST>

    例如:

    docker cp mysql91:/var/lib/mysql/binlog.000005 ./

    查看当前的本地的镜像列表

    docker image ls
    Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
    REPOSITORY                                            TAG         IMAGE ID      CREATED       SIZE
    container-registry.oracle.com/mysql/community-server  9.1         f1f889678a73  6 months ago  606 MB
    container-registry.oracle.com/database/express        18.4.0-xe   364598d20118  4 years ago   6.03 GB

    其他资源

    • 安装体验MySQL 9.1 (Docker 安装)

  • 云数据库行业动态@2025-03-07

    2025-03-07

    标题:MongoDB 2.2亿美元收购 Voyage AI;PolarDB发布PolarSearch; IBM 计划收购 DataStax

    重要更新

    MongoDB 2.2亿美元收购 Voyage AI ,该公司在向量化与相关度搜索上有着非常强的优势,可以增强 MongoDB 在 AI 场景下的竞争力。[2][3]

    PolarDB 发布“PolarSearch”节点,使用该功能时无需要进行数据同步,可以直接使用API或SDK进行文本或向量搜索操作。该功能基于OpenSearch,兼容Elasticsearch、OpenSearch生态。[4]

    IBM 计划收购 DataStax,该公司基于 Apache Cassandra 提供企业级的数据库存储与AI方案。 [1]

    更新详情

    百度云
    • Redis 服务支持自定义的分片数量
    • VectorDB 用户可以对实例进行备份恢复操作
    华为云
    • TaurusDB 代理实例支持开启Binlog拉取 [5]
    阿里云
    • 智能搜索(PolarSearch)—PolarDB MySQL版购买页支持添加搜索节点。[4]
    腾讯云
    • TDSQL-C MySQL、云数据库 MySQL 发布数据库代理版本1.3.16 [21][22]
    • 云数据库 SQL Server 发布全新多节点架构实例,提供了一主多备的高可用容灾部署方式,备节点支持只读以节省开销 [6]
    Azure(微软云)
    • Azure Backup 支持更多区域的 Azure Database for PostgreSQL 的备份 [10]
    Oracle云
    • OCI Database with PostgreSQL 支持将数据库系统备份复制到另一个区域 [11]
    • OCI Database with PostgreSQL 增加了对 pglogical 和 PostGIS 扩展的支持 [12]
    AWS(亚马逊云)
    • Amazon RDS for Db2 支持 db.m7i 和 db.r7i 实例类 [14]
    • Amazon Neptune 数据库现已在 AWS 亚太地区(马来西亚)区域推出[16]
    • Database Insights 为 RDS MySQL 和 RDS MariaDB 提供按需分析能力 [19]

    参考链接

    • [1] https://www.datastax.com/blog/ibm-plans-to-acquire-datastax
    • [2] https://blog.voyageai.com/2025/02/24/joining-mongodb/
    • [3] https://www.bloomberg.com/news/articles/2025-02-24/mongodb-buys-voyage-ai-for-220-million-to-bolster-ai-search
    • [4] https://help.aliyun.com/zh/polardb/polardb-for-mysql/user-guide/intelligent-search-polarsearch/
    • [5] https://support.huaweicloud.com/usermanual-taurusdb/taurusdb_03_0502.html
    • [6] https://cloud.tencent.com/document/product/238/115279
    • [10] https://azure.microsoft.com/updates?id=482997
    • [11] https://docs.oracle.com/iaas/releasenotes/postgresql/backup-region-copy.htm
    • [12] https://docs.oracle.com/iaas/releasenotes/postgresql/pglogical.htm
    • [14] https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.DBInstanceClass.Types.html
    • [16] https://aws.amazon.com/about-aws/whats-new/2025/03/amazon-neptune-database-aws-asia-pacific-malaysia-region
    • [19] https://aws.amazon.com/about-aws/whats-new/2025/02/database-insights-on-demand-analysis-rds-mysql-rds-mariadb

  • 云数据库行业动态@2025-02-28

    2025-02-28

    标题:腾讯云PG支持SQL调用大模型;达梦24年营收超10亿;PolarDB大会发布TPCC登顶;

    重点更新

    2月26日,PolarDB开发者大会上,阿里云宣布PolarDB登顶全球数据库性能及性价比排行榜,刷新TPC-C性能和性价比双榜的世界纪录。[1]

    达梦发布2024年报,全年营收[2]达10.4亿,同比增长31.49%;利润总额为3.8亿,同比增长24.06%。[2]

    腾讯云 PostgreSQL 支持通过 SQL 调用大模型 API(混元),实现如自然语言对话、文本转向量、文本排序等功能。[62]

    更新详情

    火山云(字节)
    • 云数据库 MySQL 支持了主节点过载保护功能、Sequence Engine、最大存储扩大为 6T 存储空间[64][65][66]
    • 云数据库 PostgresqL 新增 pg_hint_plan 插件
    • 云数据库 SQL Server 版提供了 SSL(Secure Sockets Layer)加密能力 [37]
    • 支持为实例创建跨地域的灾备实例,为实例提供跨地域的灾备能力 [39]
    • 在临时升配实例时,支持变更实例的规格类型 [40]
    • 云数据库 SQL Server 版提供审计功能 [41]
    • 在创建 TOS 备份恢复时,支持按照新的数据库名称恢复数据 [42]
    腾讯云
    • 云数据库 PostgreSQL 支持大版本为17的实例通过 SQL 调用大模型 API。使您的业务使用大模型能力更加便捷。[62]
    • TDSQL-C MySQL 版5.7内核版本更新2.1.13.002:支持二级缓存功能。[57]
    • TDSQL-C MySQL 版8.0内核版本更新3.1.15.005:在只读实例上 binlog 支持了2种订阅方式:基于 file_name 和 pos 的位点方式;基于时间戳的方式。[58]
    • TDSQL-C MySQL 版通用型计算规格新增支持了中国香港、弗吉尼亚地域。[56]
    阿里云
    • RDS MySQL 8.0 新增支持强制SSL加密功能,兼容MySQL直连方式。[4]
    • RDS MySQL倚天版新增开服地域德国(法兰克福)与美国(硅谷)。[5]
    • 数据库代理读写分离支持设置一致性级别:最终一致性、会话一致性和全局一致性。[6]
    • RDS MySQL高可用本地盘实例存储空间最大支持8000 GB。[7]
    Azure(微软云)
    • Azure Database for PostgreSQL 支持的最新 PostgreSQL 次要版本 [13]
    • Azure Cosmos DB 新增 Rust SDK [14]
    GCP(谷歌云)
    • alloydb_scann 扩展已更新,增强了向量搜索相关的能力 [18]
    • Bigtable 的自动备份功能正式发布 (GA)[21]
    • AlloyDB 集群支持执行就地主要版本升级 [25] [26]
    • Cloud SQL 实例支持在删除前创建数据的最终备份 [27]
    Oracle云
    • 支持将数据库恢复到特定的 SCN [31]
    • 支持从最新备份克隆数据库[32]
    • HeatWave新增支持版本 9.2.1 版本 [36]
    华为云
    • GeminiDB Influx新增集群增强版,进行了架构优化和调整,支持更大的集群规模,更高的读写性能,适用于更大规模的业务场景
    AWS(亚马逊云)
    • RDS for Oracle 支持空间信息补丁包 [43]
    • RDS 支持 MariaDB 11.4.5、10.11.11、10.6.21 和 10.5.28 [44]
    • RDS 支持 CloudWatch Database Insights [45]
    • RDS for PostgreSQL 支持次要版本 17.4、16.8、15.12、14.17、13.20 [54]
    • 您现在可以使用中国银联信用卡创建 AWS 账户 [55]

    参考链接

    • [1] https://mp.weixin.qq.com/s/nZ0IzuVjSCHpPh5YcnGddw
    • [2] https://file.finance.sina.com.cn/211.154.219.97:9494/MRGG/CNSESH_STOCK/2025/2025-2/2025-02-26/10757479.PDF
    • [4] https://help.aliyun.com/zh/rds/apsaradb-rds-for-mysql/ssl-encryption/
    • [5] https://help.aliyun.com/zh/rds/apsaradb-rds-for-mysql/yitian-rds-for-mysql-instances-are-available-in-germany-frankfurt-and-us-silicon-valley-regions
    • [6] https://help.aliyun.com/zh/rds/apsaradb-rds-for-mysql/configure-consistency-levels
    • [7] https://help.aliyun.com/zh/rds/apsaradb-rds-for-mysql/primary-apsaradb-rds-for-mysql-instance-types
    • [13] https://azure.microsoft.com/updates?id=474864
    • [14] https://azure.microsoft.com/updates?id=474825
    • [18] https://cloud.google.com/alloydb/docs/reference/ai/scann-index-reference
    • [21] https://cloud.google.com/bigtable/docs/backups
    • [25] https://cloud.google.com/alloydb/docs/upgrade-db-inplace-major-version
    • [26] https://cloud.google.com/products#product-launch-stages
    • [27] https://cloud.google.com/sql/docs/sqlserver/backup-recovery/backups#final-backups
    • [31] https://docs.oracle.com/iaas/releasenotes/autonomous-database-dedicated/adbd-restore-db-scn.htm
    • [32] https://docs.oracle.com/iaas/releasenotes/autonomous-database-dedicated/adbd-clone-latestbackup.htm
    • [36] https://docs.oracle.com/iaas/releasenotes/mysql-database/heatwave-921.htm
    • [37] https://www.volcengine.com/docs/6899/1458328
    • [39] https://www.volcengine.com/docs/6899/153377
    • [40] https://www.volcengine.com/docs/6899/1247827
    • [41] https://www.volcengine.com/docs/6899/1392470
    • [42] https://www.volcengine.com/docs/6899/805252
    • [43] https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.Oracle.Minor.html
    • [44] https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MariaDB.Concepts.VersionMgmt.html
    • [45] https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_DatabaseInsights.html
    • [53] https://aws.amazon.com/about-aws/whats-new/2025/02/aws-database-migration-service-multi-eni-networking/
    • [54] https://aws.amazon.com/about-aws/whats-new/2025/02/amazon-rds-postgresql-supports-minor-versions/
    • [55] https://aws.amazon.com/about-aws/whats-new/2025/02/china-unionpay-credit-card-create-aws-account/
    • [56] https://cloud.tencent.com/document/product/1003/73002
    • [57] https://cloud.tencent.com/document/product/1003/61515
    • [58] https://cloud.tencent.com/document/product/1003/61515
    • [59] https://cloud.tencent.com/document/product/1003/73002
    • [60] https://cloud.tencent.com/document/product/238/115279
    • [62] https://cloud.tencent.com/document/product/409/116227
    • [63] https://support.huaweicloud.com/influxug-nosql/nosql_06_0046.html
    • [64] https://www.volcengine.com/docs/6313/145042
    • [65] https://www.volcengine.com/docs/6313/1467064
    • [66] https://www.volcengine.com/docs/6313/74505

  • 读战国通史:秦魏河西之战

    2025-02-23

    “六国都为秦所并,读史的人,往往以为一入战国,而秦即最强,这是错误的”

    《中国通史-春秋战国的竞争和秦国的统一》 吕思勉

    战国七雄都对得起“雄”字,在不同的时期都曾经雄霸一方,在战国早期,很多国家都强于当时的秦国。其中,在三家灭智分晋之后,魏斯正式被册封为侯,是为魏文侯。之后,魏文侯、魏武侯、魏惠王三代通过用贤良、施变法,魏国变得非常强大,通过“逢泽之会”称王。这期间,魏国任用了“魏成子、翟璜、李悝、乐羊、吴起、西门豹”等人。而,由吴起为主要将领,与秦国之间长达数年的河西之战中,屡次破秦,尽取秦国的河西地区,成就魏国一时的霸业。这里就来系统的看看战国早期的秦魏之间的长达数十年的河西之战。也借此可以更深入的体会一下,吕思勉所说的“往往以为一入战国,而秦即最强,这是错误的”。

    “秦魏”的地理位置

    我们可以通过如下两幅地图,可以大致了解秦魏的地缘关系。下右图,高度经过“夸张”,可以更好的反应出,两国的地形关系。秦国核心土地处于秦岭以北、黄土高坡以南,东北方向的出路是魏、赵两国。东出函谷关则需要经过韩魏两国(苏辙《六国论》)。秦魏两国之间,“黄河”可以认为是较为天然的分界线。

    河西之战的前中期

    “河西之战 (战国)”就是发生在黄河以西,由当时最为强大的“魏国”主动挑起,经过多长战争,最终占领了黄河以西大量原本属于秦国的土地,并在这里设置了“西河郡”,由魏国军队主将“吴起”任首任郡守。主要的战役的发生地点和时间如下所示,此阶段,魏国胜多败少:

    具体的战役详情:

    • 前419年,魏军突然在河西地区筑城池,秦国派兵进攻,交战两年。前417年,魏军击败秦军。
    • 前413年,魏国大举进攻秦国,魏国李悝在郑县大败秦军。次年,魏文侯派太子击包围并占领了秦国的繁庞
    • 前409年,魏文侯任命吴起为主将,攻克秦国临晋、元里并筑城。次年,吴起攻打秦国至郑县,攻克洛阴、郃阳。

    至此,魏国全部占有原本属于秦国的河西地区,并在此设立西河郡。吴起担任首任郡守。

    河西之战的中后期

    在中期,秦国虽多次战争尝试收付河西地区,均未成功。在前389年的阴晋之战,最为有代表性。当时,秦惠公出兵号称五十万进攻魏国的阴晋,被吴起以步兵五万、战车五百辆、骑兵三千所击败。

    在战争的后期,魏惠王称王,迁都大梁。同时,秦国重用商鞅,逐渐强盛。河西之势也开始发生了变化。最终,在经过吴城之战魏国便逐渐势弱。在前330年,秦军再攻魏国上郡,大胜,最终收付了全部河西地区。

    具体的:

    • 前361年,魏惠王迁都大梁,魏国的战争中心转向了宋、卫、韩、赵等国。之后在元里、安邑、固阳都发生过争夺战,双方互有来回。
    • 而在前340年,吴城之战,魏国被秦商鞅击败
    • 前330年,秦军再攻魏国上郡,此役魏国防卫西河、上郡的主力全军覆没,主将龙贾被俘,魏惠王被迫于次年将西河郡全部献给秦国。至此,秦全部收复了被魏夺占的河西地区。

    魏国的强盛与衰落

    早期在三家灭智分晋之后,魏文侯、魏武侯两代人用贤良、施变法使得魏国非常强大。期间最为有代表性的人物包括李悝、吴起、西门豹等。其中李悝变法使国家强盛富足、吴起攻城略地,使得魏国声名大噪,而西门豹善治水…哦,上了小学语文课本。

    不合时宜的称王与“东扩”

    魏惠王不合时宜的称王与“东扩”,现在来看,是有违天时与地利的。在魏国最为强大时候,魏惠文王决定迁都,并秦国在游说之下称王。但此时,河西之地并未真正稳固,原本地处边陲的秦国,经过历代图治与变法(“秦国之强起于献公而成于孝公”),变得非常强大。在魏国东扩的时候,西边被秦国完全打败。不仅河西土地尽失,就连原本的旧都安邑也被占领。

    不合时宜的称王与“东扩”为后续魏国的衰落埋下种子。

    用人失误

    而后期,将相不和,魏惠王受谗言弃用吴起,也使得河西守势变弱。关于这一点,公孙痤在后来取得某次战役胜利的时候,依旧是非常认可吴起的功劳的,可见吴起之于魏国的重要。而忽视卫鞅,并任由其前往秦国,则更是此消彼长。

    再观秦国

    而秦国经过数代君王努力,最终不仅取回河西,并继续攻下河东,包括原魏国国都(安邑)。同时,拿下了东出函谷关的要到,以及部分“关东“的土地,为后续东出函谷关,一统六国做好了准备。

    最后

    这场战争来看,任用贤才、实施变法改革,使得国盛民强,是战争胜利的基础。利用地形、政策等巩固战果,才能够考虑进一步拓展疆域。通观全国之势,当时魏国虽然强大,但还不具备统一的实力,此时称王,反而成为众矢之的,而关中之地此时有没有守住,最终导致魏国衰落。

←Previous Page Next Page→
  • “众鸟高飞尽 孤云独去闲”
  • —唐 李白

关于我

orczhou.com

·

Theme by Brian Gardner

本作品采用知识共享许可协议 许可协议进行许可。