[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6PA50TZKVVFDAT4M2DTK7T4":3,"skill-same:01M6PA50TZKVVFDAT4M2DTK7T4":70},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":26,"commitSha":51,"skillDirectory":52,"forksCount":13,"repositoryHtmlUrl":53,"repositoryHomepageUrl":6,"ownerHtmlUrl":54,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":55,"install":56,"resources":69},"01M6PA50TZKVVFDAT4M2DTK7T4","mysql",null,"Administer MySQL\u002FMariaDB databases. Configure replication and optimize performance. Use when managing MySQL deployments.","duc-duy-1612\u002FOnline-Delivery-Systems-Web","duc-duy-1612","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F192231384?v=4","01M6NSDKQQDKVTHZ8DZMZ1VYY6","01M6NSDKW8DDVTQHBT1HBDDJPT",0,"MIT","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fmysql\u002FSKILL.md",[],[5,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],"deployments","relevant","replication","scripts","critical","os","platform","optimize","main","community","security","databases","agent-skills","only","configure","access","devops-security","license","performance","2026-11-10 10:12:30",false,"---\nname: mysql\ndescription: Administer MySQL\u002FMariaDB databases. Configure replication and optimize\n  performance. Use when managing MySQL deployments.\ncategory: devops\nrisk: critical\nsource: https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills\nsource_repo: BagelHole\u002FDevOps-Security-Agent-Skills\nsource_type: community\ndate_added: '2026-09-20'\nlicense: MIT\nlicense_source: https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills\u002Fblob\u002Fmain\u002FLICENSE\ncompatibility: Requires the relevant OS\u002Fplatform tooling and privileged access where\n  noted. Docs-only; helper scripts and templates not bundled.\nmetadata:\n  author: devops-skills\n  version: '1.0'\n---\n\n# MySQL \u002F MariaDB\n\nAdminister, optimize, and secure MySQL and MariaDB databases in development and production environments.\n\n## When to Use\n\n- You need a mature, widely supported relational database.\n- Your stack depends on MySQL-specific features or compatibility (WordPress, Magento, many PHP frameworks).\n- You are setting up source-replica replication for read scaling.\n- You want to tune InnoDB for high-throughput transactional workloads.\n\n## Prerequisites\n\n- Linux server (Debian\u002FUbuntu or RHEL-based) or Docker.\n- Root or sudo access for package installation.\n- Familiarity with SQL fundamentals.\n\n## Installation and Setup\n\n```bash\n# Debian \u002F Ubuntu — MySQL 8\nsudo apt update\nsudo apt install -y mysql-server\n\n# RHEL \u002F Amazon Linux\nsudo dnf install -y mysql-server\nsudo systemctl enable --now mysqld\n\n# Run the secure installation wizard\nsudo mysql_secure_installation\n# Prompts: set root password, remove anonymous users, disable remote root, remove test db\n\n# Verify\nmysql --version\nsudo systemctl status mysql\n```\n\n## Initial User and Database Setup\n\n```bash\nsudo mysql -u root -p\n```\n\n```sql\n-- Create a database\nCREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n\n-- Create an application user with strong auth\nCREATE USER 'myapp'@'%' IDENTIFIED BY 'strong_password_here';\nGRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'myapp'@'%';\nFLUSH PRIVILEGES;\n\n-- Verify\nSHOW GRANTS FOR 'myapp'@'%';\n```\n\n## mysql CLI Reference\n\n```bash\n# Connect\nmysql -u myapp -p -h 127.0.0.1 mydb\n\n# Execute a single statement\nmysql -u myapp -p -e \"SELECT COUNT(*) FROM orders;\" mydb\n\n# Import a SQL file\nmysql -u myapp -p mydb \u003C schema.sql\n\n# Export query results to CSV\nmysql -u myapp -p -e \"SELECT * FROM users\" mydb \\\n  | tr '\\t' ',' > users.csv\n```\n\n```\n-- Inside the mysql shell\nSHOW DATABASES;\nUSE mydb;\nSHOW TABLES;\nDESCRIBE users;\nSHOW CREATE TABLE users\\G\nSHOW PROCESSLIST;\nSHOW ENGINE INNODB STATUS\\G\n```\n\n## Configuration Tuning\n\nEdit `\u002Fetc\u002Fmysql\u002Fmysql.conf.d\u002Fmysqld.cnf` (or `\u002Fetc\u002Fmy.cnf` on RHEL).\n\n```ini\n[mysqld]\n# -- Networking --\nbind-address           = 0.0.0.0\nmax_connections        = 300\nwait_timeout           = 600\ninteractive_timeout    = 600\n\n# -- InnoDB (most impactful settings) --\ninnodb_buffer_pool_size   = 4G          # ~70% of RAM on a dedicated server\ninnodb_buffer_pool_instances = 4        # 1 per GB of pool (up to 64)\ninnodb_log_file_size      = 1G\ninnodb_flush_log_at_trx_commit = 1      # 1 = ACID; 2 = faster, slight risk\ninnodb_flush_method       = O_DIRECT    # avoids double buffering on Linux\ninnodb_io_capacity        = 2000        # raise for SSD\ninnodb_io_capacity_max    = 4000\n\n# -- Query cache (disabled in MySQL 8, use ProxySQL or app cache) --\n# query_cache_type = 0\n\n# -- Logging --\nslow_query_log         = 1\nslow_query_log_file    = \u002Fvar\u002Flog\u002Fmysql\u002Fslow.log\nlong_query_time        = 1\nlog_error              = \u002Fvar\u002Flog\u002Fmysql\u002Ferror.log\n\n# -- Binary log (required for replication) --\nserver-id              = 1\nlog_bin                = \u002Fvar\u002Flog\u002Fmysql\u002Fmysql-bin\nbinlog_expire_logs_seconds = 604800     # 7 days\nsync_binlog            = 1\n\n# -- Character set --\ncharacter-set-server   = utf8mb4\ncollation-server       = utf8mb4_unicode_ci\n```\n\n```bash\n# Apply changes\nsudo systemctl restart mysql\n\n# Verify a setting at runtime\nmysql -u root -p -e \"SHOW VARIABLES LIKE 'innodb_buffer_pool_size';\"\n```\n\n## Backup and Restore\n\n### Logical Backups with mysqldump\n\n```bash\n# Single database\nmysqldump -u root -p --single-transaction --routines --triggers \\\n  mydb > \u002Fbackups\u002Fmydb_$(date +%F).sql\n\n# All databases\nmysqldump -u root -p --all-databases --single-transaction \\\n  > \u002Fbackups\u002Fall_$(date +%F).sql\n\n# Compressed backup\nmysqldump -u root -p --single-transaction mydb \\\n  | gzip > \u002Fbackups\u002Fmydb_$(date +%F).sql.gz\n\n# Restore\nmysql -u root -p mydb \u003C \u002Fbackups\u002Fmydb_2025-01-15.sql\n\n# Restore compressed\ngunzip \u003C \u002Fbackups\u002Fmydb_2025-01-15.sql.gz | mysql -u root -p mydb\n```\n\n### Physical Backups with Percona XtraBackup\n\n```bash\n# Install\nsudo apt install -y percona-xtrabackup-80\n\n# Full backup\nxtrabackup --backup --user=root --password=secret \\\n  --target-dir=\u002Fbackups\u002Ffull_$(date +%F)\n\n# Prepare the backup (apply redo logs)\nxtrabackup --prepare --target-dir=\u002Fbackups\u002Ffull_2025-01-15\n\n# Restore (stop MySQL first)\nsudo systemctl stop mysql\nls \u002Fvar\u002Flib\u002Fmysql\u002F*  # verify this is the correct data dir first\nsudo find \u002Fvar\u002Flib\u002Fmysql -mindepth 1 -delete  # empty the data dir; snapshots must exist (see Limitations)\nxtrabackup --move-back --target-dir=\u002Fbackups\u002Ffull_2025-01-15\nsudo chown -R mysql:mysql \u002Fvar\u002Flib\u002Fmysql\nsudo systemctl start mysql\n```\n\n### Incremental Backup with XtraBackup\n\n```bash\n# Incremental based on the full backup\nxtrabackup --backup --user=root --password=secret \\\n  --target-dir=\u002Fbackups\u002Finc_$(date +%F) \\\n  --incremental-basedir=\u002Fbackups\u002Ffull_2025-01-15\n\n# Prepare: apply full, then incremental\nxtrabackup --prepare --apply-log-only --target-dir=\u002Fbackups\u002Ffull_2025-01-15\nxtrabackup --prepare --target-dir=\u002Fbackups\u002Ffull_2025-01-15 \\\n  --incremental-dir=\u002Fbackups\u002Finc_2025-01-16\n```\n\n## Source-Replica Replication\n\n### Source (Primary)\n\n```ini\n# \u002Fetc\u002Fmysql\u002Fmysql.conf.d\u002Fmysqld.cnf\n[mysqld]\nserver-id       = 1\nlog_bin         = \u002Fvar\u002Flog\u002Fmysql\u002Fmysql-bin\nbinlog_format   = ROW\n```\n\n```sql\n-- Create replication user\nCREATE USER 'replicator'@'10.0.0.%' IDENTIFIED BY 'repl_secret';\nGRANT REPLICATION SLAVE ON *.* TO 'replicator'@'10.0.0.%';\nFLUSH PRIVILEGES;\n\n-- Get current binary log position\nSHOW MASTER STATUS\\G\n```\n\n### Replica\n\n```ini\n# \u002Fetc\u002Fmysql\u002Fmysql.conf.d\u002Fmysqld.cnf\n[mysqld]\nserver-id  = 2\nrelay_log  = \u002Fvar\u002Flog\u002Fmysql\u002Frelay-bin\nread_only  = ON\n```\n\n```sql\n-- Point replica to source (use SHOW MASTER STATUS values)\nCHANGE REPLICATION SOURCE TO\n  SOURCE_HOST     = '10.0.0.1',\n  SOURCE_USER     = 'replicator',\n  SOURCE_PASSWORD = '...' # replication secret from your vault,\n  SOURCE_LOG_FILE = 'mysql-bin.000003',\n  SOURCE_LOG_POS  = 154;\n\nSTART REPLICA;\n\n-- Verify\nSHOW REPLICA STATUS\\G\n-- Check: Replica_IO_Running = Yes, Replica_SQL_Running = Yes, Seconds_Behind_Source = 0\n```\n\n## Monitoring Queries\n\n```sql\n-- Connection statistics\nSHOW STATUS LIKE 'Threads_connected';\nSHOW STATUS LIKE 'Max_used_connections';\n\n-- InnoDB buffer pool hit ratio (should be > 99%)\nSELECT\n  ROUND(100 - (\n    (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads') \u002F\n    (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests')\n  ) * 100, 2) AS buffer_pool_hit_pct;\n\n-- Top 10 slow queries (requires performance_schema)\nSELECT DIGEST_TEXT, COUNT_STAR, AVG_TIMER_WAIT \u002F 1e12 AS avg_sec\nFROM performance_schema.events_statements_summary_by_digest\nORDER BY AVG_TIMER_WAIT DESC\nLIMIT 10;\n\n-- Table sizes\nSELECT table_name,\n       ROUND(data_length \u002F 1024 \u002F 1024, 2) AS data_mb,\n       ROUND(index_length \u002F 1024 \u002F 1024, 2) AS index_mb,\n       table_rows\nFROM information_schema.tables\nWHERE table_schema = 'mydb'\nORDER BY data_length DESC;\n\n-- Check replication lag\nSHOW REPLICA STATUS\\G\n-- Look at Seconds_Behind_Source\n```\n\n## Docker Compose Setup\n\n```yaml\n# docker-compose.yml\nversion: \"3.9\"\n\nservices:\n  mysql:\n    image: mysql:8.0\n    restart: unless-stopped\n    ports:\n      - \"3306:3306\"\n    environment:\n      MYSQL_ROOT_PASSWORD: rootpass\n      MYSQL_DATABASE: mydb\n      MYSQL_USER: myapp\n      MYSQL_PASSWORD: secret\n    volumes:\n      - mysql_data:\u002Fvar\u002Flib\u002Fmysql\n      - .\u002Finit.sql:\u002Fdocker-entrypoint-initdb.d\u002Finit.sql\n    command: >\n      --innodb-buffer-pool-size=512M\n      --max-connections=200\n      --slow-query-log=ON\n      --long-query-time=1\n      --character-set-server=utf8mb4\n      --collation-server=utf8mb4_unicode_ci\n    healthcheck:\n      test: [\"CMD\", \"mysqladmin\", \"ping\", \"-h\", \"localhost\", \"-u\", \"root\", \"-prootpass\"]\n      interval: 10s\n      timeout: 5s\n      retries: 5\n\n  phpmyadmin:\n    image: phpmyadmin:latest\n    restart: unless-stopped\n    ports:\n      - \"8080:80\"\n    environment:\n      PMA_HOST: mysql\n      PMA_USER: root\n      PMA_PASSWORD: rootpass\n    depends_on:\n      mysql:\n        condition: service_healthy\n\nvolumes:\n  mysql_data:\n```\n\n```bash\ndocker compose up -d\nmysql -h 127.0.0.1 -u myapp -psecret mydb\n```\n\n## Maintenance Tasks\n\n```bash\n# Optimize a fragmented table (locks the table briefly)\nmysql -u root -p -e \"OPTIMIZE TABLE mydb.orders;\"\n\n# Analyze tables to update statistics\nmysql -u root -p -e \"ANALYZE TABLE mydb.orders;\"\n\n# Check and repair a table\nmysql -u root -p -e \"CHECK TABLE mydb.orders;\"\nmysql -u root -p -e \"REPAIR TABLE mydb.orders;\"\n\n# Rotate slow query log\nsudo mv \u002Fvar\u002Flog\u002Fmysql\u002Fslow.log \u002Fvar\u002Flog\u002Fmysql\u002Fslow.log.old\nmysqladmin -u root -p flush-logs\n```\n\n## Troubleshooting\n\n| Symptom | Likely Cause | Fix |\n|---|---|---|\n| `Too many connections` | Connection limit exceeded | Increase `max_connections`; use connection pooling (ProxySQL) |\n| Slow queries across the board | `innodb_buffer_pool_size` too small | Set to ~70% of available RAM and restart |\n| Replication stopped (`SQL_Running: No`) | Duplicate key or schema mismatch on replica | Check `SHOW REPLICA STATUS\\G` error; skip or fix the row |\n| `Table is full` | Disk space exhausted or table limit hit | Free disk space; check `innodb_data_file_path` autoextend |\n| `Lock wait timeout exceeded` | Long-running transaction holding row locks | Identify with `SHOW ENGINE INNODB STATUS`; kill the blocking query |\n| High IOPS \u002F disk usage | Redo log too small causing frequent flushes | Increase `innodb_log_file_size` (requires restart) |\n\n## Related Skills\n\n- postgresql (`postgresql-devsec`) - Alternative relational database\n- database-backups (`database-backups`) - Automated backup strategies\n- redis (`redis`) - Caching layer to reduce database load\n- planetscale (`planetscale`) - Managed MySQL-compatible with branching\n\n## Limitations\n\n- Infrastructure commands can disrupt services: confirm target host\u002Fscope and have backups\u002Fsnapshots before mutating state.\n- Docs-only import: upstream scripts and templates not bundled.\n\n","# MySQL \u002F MariaDB\n\nAdminister, optimize, and secure MySQL and MariaDB databases in development and production environments.\n\n## When to Use\n\n- You need a mature, widely supported relational database.\n- Your stack depends on MySQL-specific features or compatibility (WordPress, Magento, many PHP frameworks).\n- You are setting up source-replica replication for read scaling.\n- You want to tune InnoDB for high-throughput transactional workloads.\n\n## Prerequisites\n\n- Linux server (Debian\u002FUbuntu or RHEL-based) or Docker.\n- Root or sudo access for package installation.\n- Familiarity with SQL fundamentals.\n\n## Installation and Setup\n\n```bash\n# Debian \u002F Ubuntu — MySQL 8\nsudo apt update\nsudo apt install -y mysql-server\n\n# RHEL \u002F Amazon Linux\nsudo dnf install -y mysql-server\nsudo systemctl enable --now mysqld\n\n# Run the secure installation wizard\nsudo mysql_secure_installation\n# Prompts: set root password, remove anonymous users, disable remote root, remove test db\n\n# Verify\nmysql --version\nsudo systemctl status mysql\n```\n\n## Initial User and Database Setup\n\n```bash\nsudo mysql -u root -p\n```\n\n```sql\n-- Create a database\nCREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n\n-- Create an application user with strong auth\nCREATE USER 'myapp'@'%' IDENTIFIED BY 'strong_password_here';\nGRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'myapp'@'%';\nFLUSH PRIVILEGES;\n\n-- Verify\nSHOW GRANTS FOR 'myapp'@'%';\n```\n\n## mysql CLI Reference\n\n```bash\n# Connect\nmysql -u myapp -p -h 127.0.0.1 mydb\n\n# Execute a single statement\nmysql -u myapp -p -e \"SELECT COUNT(*) FROM orders;\" mydb\n\n# Import a SQL file\nmysql -u myapp -p mydb \u003C schema.sql\n\n# Export query results to CSV\nmysql -u myapp -p -e \"SELECT * FROM users\" mydb \\\n  | tr '\\t' ',' > users.csv\n```\n\n```\n-- Inside the mysql shell\nSHOW DATABASES;\nUSE mydb;\nSHOW TABLES;\nDESCRIBE users;\nSHOW CREATE TABLE users\\G\nSHOW PROCESSLIST;\nSHOW ENGINE INNODB STATUS\\G\n```\n\n## Configuration Tuning\n\nEdit `\u002Fetc\u002Fmysql\u002Fmysql.conf.d\u002Fmysqld.cnf` (or `\u002Fetc\u002Fmy.cnf` on RHEL).\n\n```ini\n[mysqld]\n# -- Networking --\nbind-address           = 0.0.0.0\nmax_connections        = 300\nwait_timeout           = 600\ninteractive_timeout    = 600\n\n# -- InnoDB (most impactful settings) --\ninnodb_buffer_pool_size   = 4G          # ~70% of RAM on a dedicated server\ninnodb_buffer_pool_instances = 4        # 1 per GB of pool (up to 64)\ninnodb_log_file_size      = 1G\ninnodb_flush_log_at_trx_commit = 1      # 1 = ACID; 2 = faster, slight risk\ninnodb_flush_method       = O_DIRECT    # avoids double buffering on Linux\ninnodb_io_capacity        = 2000        # raise for SSD\ninnodb_io_capacity_max    = 4000\n\n# -- Query cache (disabled in MySQL 8, use ProxySQL or app cache) --\n# query_cache_type = 0\n\n# -- Logging --\nslow_query_log         = 1\nslow_query_log_file    = \u002Fvar\u002Flog\u002Fmysql\u002Fslow.log\nlong_query_time        = 1\nlog_error              = \u002Fvar\u002Flog\u002Fmysql\u002Ferror.log\n\n# -- Binary log (required for replication) --\nserver-id              = 1\nlog_bin                = \u002Fvar\u002Flog\u002Fmysql\u002Fmysql-bin\nbinlog_expire_logs_seconds = 604800     # 7 days\nsync_binlog            = 1\n\n# -- Character set --\ncharacter-set-server   = utf8mb4\ncollation-server       = utf8mb4_unicode_ci\n```\n\n```bash\n# Apply changes\nsudo systemctl restart mysql\n\n# Verify a setting at runtime\nmysql -u root -p -e \"SHOW VARIABLES LIKE 'innodb_buffer_pool_size';\"\n```\n\n## Backup and Restore\n\n### Logical Backups with mysqldump\n\n```bash\n# Single database\nmysqldump -u root -p --single-transaction --routines --triggers \\\n  mydb > \u002Fbackups\u002Fmydb_$(date +%F).sql\n\n# All databases\nmysqldump -u root -p --all-databases --single-transaction \\\n  > \u002Fbackups\u002Fall_$(date +%F).sql\n\n# Compressed backup\nmysqldump -u root -p --single-transaction mydb \\\n  | gzip > \u002Fbackups\u002Fmydb_$(date +%F).sql.gz\n\n# Restore\nmysql -u root -p mydb \u003C \u002Fbackups\u002Fmydb_2025-01-15.sql\n\n# Restore compressed\ngunzip \u003C \u002Fbackups\u002Fmydb_2025-01-15.sql.gz | mysql -u root -p mydb\n```\n\n### Physical Backups with Percona XtraBackup\n\n```bash\n# Install\nsudo apt install -y percona-xtrabackup-80\n\n# Full backup\nxtrabackup --backup --user=root --password=secret \\\n  --target-dir=\u002Fbackups\u002Ffull_$(date +%F)\n\n# Prepare the backup (apply redo logs)\nxtrabackup --prepare --target-dir=\u002Fbackups\u002Ffull_2025-01-15\n\n# Restore (stop MySQL first)\nsudo systemctl stop mysql\nls \u002Fvar\u002Flib\u002Fmysql\u002F*  # verify this is the correct data dir first\nsudo find \u002Fvar\u002Flib\u002Fmysql -mindepth 1 -delete  # empty the data dir; snapshots must exist (see Limitations)\nxtrabackup --move-back --target-dir=\u002Fbackups\u002Ffull_2025-01-15\nsudo chown -R mysql:mysql \u002Fvar\u002Flib\u002Fmysql\nsudo systemctl start mysql\n```\n\n### Incremental Backup with XtraBackup\n\n```bash\n# Incremental based on the full backup\nxtrabackup --backup --user=root --password=secret \\\n  --target-dir=\u002Fbackups\u002Finc_$(date +%F) \\\n  --incremental-basedir=\u002Fbackups\u002Ffull_2025-01-15\n\n# Prepare: apply full, then incremental\nxtrabackup --prepare --apply-log-only --target-dir=\u002Fbackups\u002Ffull_2025-01-15\nxtrabackup --prepare --target-dir=\u002Fbackups\u002Ffull_2025-01-15 \\\n  --incremental-dir=\u002Fbackups\u002Finc_2025-01-16\n```\n\n## Source-Replica Replication\n\n### Source (Primary)\n\n```ini\n# \u002Fetc\u002Fmysql\u002Fmysql.conf.d\u002Fmysqld.cnf\n[mysqld]\nserver-id       = 1\nlog_bin         = \u002Fvar\u002Flog\u002Fmysql\u002Fmysql-bin\nbinlog_format   = ROW\n```\n\n```sql\n-- Create replication user\nCREATE USER 'replicator'@'10.0.0.%' IDENTIFIED BY 'repl_secret';\nGRANT REPLICATION SLAVE ON *.* TO 'replicator'@'10.0.0.%';\nFLUSH PRIVILEGES;\n\n-- Get current binary log position\nSHOW MASTER STATUS\\G\n```\n\n### Replica\n\n```ini\n# \u002Fetc\u002Fmysql\u002Fmysql.conf.d\u002Fmysqld.cnf\n[mysqld]\nserver-id  = 2\nrelay_log  = \u002Fvar\u002Flog\u002Fmysql\u002Frelay-bin\nread_only  = ON\n```\n\n```sql\n-- Point replica to source (use SHOW MASTER STATUS values)\nCHANGE REPLICATION SOURCE TO\n  SOURCE_HOST     = '10.0.0.1',\n  SOURCE_USER     = 'replicator',\n  SOURCE_PASSWORD = '...' # replication secret from your vault,\n  SOURCE_LOG_FILE = 'mysql-bin.000003',\n  SOURCE_LOG_POS  = 154;\n\nSTART REPLICA;\n\n-- Verify\nSHOW REPLICA STATUS\\G\n-- Check: Replica_IO_Running = Yes, Replica_SQL_Running = Yes, Seconds_Behind_Source = 0\n```\n\n## Monitoring Queries\n\n```sql\n-- Connection statistics\nSHOW STATUS LIKE 'Threads_connected';\nSHOW STATUS LIKE 'Max_used_connections';\n\n-- InnoDB buffer pool hit ratio (should be > 99%)\nSELECT\n  ROUND(100 - (\n    (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads') \u002F\n    (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests')\n  ) * 100, 2) AS buffer_pool_hit_pct;\n\n-- Top 10 slow queries (requires performance_schema)\nSELECT DIGEST_TEXT, COUNT_STAR, AVG_TIMER_WAIT \u002F 1e12 AS avg_sec\nFROM performance_schema.events_statements_summary_by_digest\nORDER BY AVG_TIMER_WAIT DESC\nLIMIT 10;\n\n-- Table sizes\nSELECT table_name,\n       ROUND(data_length \u002F 1024 \u002F 1024, 2) AS data_mb,\n       ROUND(index_length \u002F 1024 \u002F 1024, 2) AS index_mb,\n       table_rows\nFROM information_schema.tables\nWHERE table_schema = 'mydb'\nORDER BY data_length DESC;\n\n-- Check replication lag\nSHOW REPLICA STATUS\\G\n-- Look at Seconds_Behind_Source\n```\n\n## Docker Compose Setup\n\n```yaml\n# docker-compose.yml\nversion: \"3.9\"\n\nservices:\n  mysql:\n    image: mysql:8.0\n    restart: unless-stopped\n    ports:\n      - \"3306:3306\"\n    environment:\n      MYSQL_ROOT_PASSWORD: rootpass\n      MYSQL_DATABASE: mydb\n      MYSQL_USER: myapp\n      MYSQL_PASSWORD: secret\n    volumes:\n      - mysql_data:\u002Fvar\u002Flib\u002Fmysql\n      - .\u002Finit.sql:\u002Fdocker-entrypoint-initdb.d\u002Finit.sql\n    command: >\n      --innodb-buffer-pool-size=512M\n      --max-connections=200\n      --slow-query-log=ON\n      --long-query-time=1\n      --character-set-server=utf8mb4\n      --collation-server=utf8mb4_unicode_ci\n    healthcheck:\n      test: [\"CMD\", \"mysqladmin\", \"ping\", \"-h\", \"localhost\", \"-u\", \"root\", \"-prootpass\"]\n      interval: 10s\n      timeout: 5s\n      retries: 5\n\n  phpmyadmin:\n    image: phpmyadmin:latest\n    restart: unless-stopped\n    ports:\n      - \"8080:80\"\n    environment:\n      PMA_HOST: mysql\n      PMA_USER: root\n      PMA_PASSWORD: rootpass\n    depends_on:\n      mysql:\n        condition: service_healthy\n\nvolumes:\n  mysql_data:\n```\n\n```bash\ndocker compose up -d\nmysql -h 127.0.0.1 -u myapp -psecret mydb\n```\n\n## Maintenance Tasks\n\n```bash\n# Optimize a fragmented table (locks the table briefly)\nmysql -u root -p -e \"OPTIMIZE TABLE mydb.orders;\"\n\n# Analyze tables to update statistics\nmysql -u root -p -e \"ANALYZE TABLE mydb.orders;\"\n\n# Check and repair a table\nmysql -u root -p -e \"CHECK TABLE mydb.orders;\"\nmysql -u root -p -e \"REPAIR TABLE mydb.orders;\"\n\n# Rotate slow query log\nsudo mv \u002Fvar\u002Flog\u002Fmysql\u002Fslow.log \u002Fvar\u002Flog\u002Fmysql\u002Fslow.log.old\nmysqladmin -u root -p flush-logs\n```\n\n## Troubleshooting\n\n| Symptom | Likely Cause | Fix |\n|---|---|---|\n| `Too many connections` | Connection limit exceeded | Increase `max_connections`; use connection pooling (ProxySQL) |\n| Slow queries across the board | `innodb_buffer_pool_size` too small | Set to ~70% of available RAM and restart |\n| Replication stopped (`SQL_Running: No`) | Duplicate key or schema mismatch on replica | Check `SHOW REPLICA STATUS\\G` error; skip or fix the row |\n| `Table is full` | Disk space exhausted or table limit hit | Free disk space; check `innodb_data_file_path` autoextend |\n| `Lock wait timeout exceeded` | Long-running transaction holding row locks | Identify with `SHOW ENGINE INNODB STATUS`; kill the blocking query |\n| High IOPS \u002F disk usage | Redo log too small causing frequent flushes | Increase `innodb_log_file_size` (requires restart) |\n\n## Related Skills\n\n- postgresql (`postgresql-devsec`) - Alternative relational database\n- database-backups (`database-backups`) - Automated backup strategies\n- redis (`redis`) - Caching layer to reduce database load\n- planetscale (`planetscale`) - Managed MySQL-compatible with branching\n\n## Limitations\n\n- Infrastructure commands can disrupt services: confirm target host\u002Fscope and have backups\u002Fsnapshots before mutating state.\n- Docs-only import: upstream scripts and templates not bundled.\n\n",{"name":5,"risk":22,"source":42,"license":14,"category":43,"metadata":44,"date_added":47,"description":7,"source_repo":48,"source_type":27,"compatibility":49,"license_source":50},"https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills","devops",{"author":45,"version":46},"devops-skills","1.0","2026-09-20","BagelHole\u002FDevOps-Security-Agent-Skills","Requires the relevant OS\u002Fplatform tooling and privileged access where noted. Docs-only; helper scripts and templates not bundled.","https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills\u002Fblob\u002Fmain\u002FLICENSE","f3312ba749561b6159f477dbfc9313c875d40a56",".agents\u002Fskills_archive\u002Fmysql","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612","2026-10-25 23:50:58",{"source":8,"skillName":5,"commands":57,"prompt":67,"zipAvailable":68},[58,61,64],{"tool":59,"command":60},"npx","npx skills add duc-duy-1612\u002FOnline-Delivery-Systems-Web --skill mysql",{"tool":62,"command":63},"bunx","bunx skills add duc-duy-1612\u002FOnline-Delivery-Systems-Web --skill mysql",{"tool":65,"command":66},"pnpm","pnpm dlx skills add duc-duy-1612\u002FOnline-Delivery-Systems-Web --skill mysql","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fmysql\u002FSKILL.md",true,[],[71,93,117,141,169,193],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":82,"publishedAt":37},"01M6Q0FA5FZ410Z33Z3TFQ4DBA","zero-trust","Implement zero-trust network architecture. Configure identity-based access, micro-segmentation, and continuous verification. Use when implementing modern security architectures.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fzero-trust\u002FSKILL.md",[77],{"categoryNo":78,"categoryName":79,"taxonomyType":80,"taxonomyTypeDesc":81},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",[83,84,85,86,87,88,73,89,34,33,32,31,27,26,90,22,91,21,19,92],"ZeRO","trust","zero trust","architecture","assessment","verification","segmentation","active","scope","implementing",{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":37},"01M6Q0F1YZJW3KX5FBKEVZ8CV4","zcode-delegate","Delegate coding tasks to the Z.AI ZCode CLI only when the user explicitly requests it, while the orchestrator retains review and landing responsibility.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fzcode-delegate\u002FSKILL.md",[],[100,101,102,103,104,105,106,107,108,109,110,111,112,31,113,27,114,115,22,116],"delegate","zcode","zcode delegate","review","cli","orchestration","tasks","run","Bash","model","node","read","orchestrator","files","desktop app","app","agent-orchestration",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":123,"publishedAt":37},"01M6Q0ETK41VGNMYEXW0T00AJN","youtube-transcript","Fetch YouTube transcripts through DeepAPI or local fallback tooling and save clean text output.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-transcript\u002FSKILL.md",[],[124,125,126,127,128,129,130,35,131,132,133,134,135,27,26,136,137,138,139,140],"transcript","youtube transcript","youtube","safe","github","codex","research","https","text","fetch","tooling","clean","local","output","deepapi","youtube transcripts","blob",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":158,"publishedAt":37},"01M6Q0EPPH2PVMDW40017F8WX0","youtube-transcript-skills","Fetch YouTube video transcripts, search videos\u002Fchannels, browse channels, and extract playlists via the getyoutubetranscript.com API - free tier, no card required.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-transcript-skills\u002FSKILL.md",[147,150,153],{"categoryNo":148,"categoryName":149,"taxonomyType":80,"taxonomyTypeDesc":81},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":151,"categoryName":152,"taxonomyType":80,"taxonomyTypeDesc":81},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":154,"categoryName":155,"taxonomyType":156,"taxonomyTypeDesc":157},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[124,125,126,159,127,160,128,129,35,161,162,163,164,133,165,27,26,166,167,168],"youtube transcript skills","gemini","search","api","Video","browse","api-integration","free","card","channels",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":173,"categories":174,"keywords":179,"publishedAt":37},"01M6Q0EAB96PX83W5PTE8A0R8D","youtube-notetaker","Turn YouTube talks into local study notes with slides, transcripts, editable annotations, and a markdown-backed viewer.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-notetaker\u002FSKILL.md",[175,178],{"categoryNo":176,"categoryName":177,"taxonomyType":80,"taxonomyTypeDesc":81},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":151,"categoryName":152,"taxonomyType":80,"taxonomyTypeDesc":81},[126,180,181,104,127,182,183,184,185,35,163,186,187,188,189,26,190,136,191,192],"youtube notetaker","notetaker","workflow","official","notes","code","markdown","slides","annotations","README","study","dair-academy","viewer",{"skillNo":194,"name":195,"nameZh":6,"description":196,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":197,"categories":198,"keywords":200,"publishedAt":37},"01M6Q0E55F0GW5MX48V8HXS8B5","youtube-full","Fetch YouTube transcripts, search videos, browse channels, and extract playlists via TranscriptAPI — no yt-dlp, no Google API key, works from any cloud server.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-full\u002FSKILL.md",[199],{"categoryNo":148,"categoryName":149,"taxonomyType":80,"taxonomyTypeDesc":81},[201,126,202,203,127,160,161,204,205,162,163,164,133,206,165,27,26,166,207,139],"youtube full","full","google","server","dlp","credits","automatic"]