[{"data":1,"prerenderedAt":577},["ShallowReactive",2],{"page-/post/nuxt/prod-docker-mysql-config":3,"surrounding-page":568},{"id":4,"title":5,"author":6,"body":7,"date":556,"description":557,"extension":558,"group":6,"lastmod":559,"meta":560,"navigation":153,"path":561,"rawbody":562,"seo":563,"showTitle":6,"stem":564,"tags":565,"versions":6,"__hash__":567},"content/post/nuxt/prod-docker-mysql-config.md","Debian12 服务器上启动 MySQL 服务",null,{"type":8,"value":9,"toc":554},"minimark",[10,21,62,65,100,103,167,170,275,278,287,290,311,314,386,389,402,405,461,464,523,526,550],[11,12,13,14],"p",{},"启动方式同",[15,16,20],"a",{"href":17,"rel":18},"https://blog.zzao.club/post/nuxt/local-init-mysql-by-docker",[19],"nofollow","本地",[22,23,28],"pre",{"className":24,"code":25,"language":26,"meta":27,"style":27},"language-shell shiki shiki-themes github-light","docker compose exec mysql mysql -u root -p\n","shell","",[29,30,31],"code",{"__ignoreMap":27},[32,33,36,40,44,47,50,52,56,59],"span",{"class":34,"line":35},"line",1,[32,37,39],{"class":38},"s7eDp","docker",[32,41,43],{"class":42},"sYBdl"," compose",[32,45,46],{"class":42}," exec",[32,48,49],{"class":42}," mysql",[32,51,49],{"class":42},[32,53,55],{"class":54},"sYu0t"," -u",[32,57,58],{"class":42}," root",[32,60,61],{"class":54}," -p\n",[11,63,64],{},"创建一个数据库",[22,66,68],{"className":24,"code":67,"language":26,"meta":27,"style":27},"CREATE DATABASE imgx CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n",[29,69,70],{"__ignoreMap":27},[32,71,72,75,78,81,84,87,90,93,96],{"class":34,"line":35},[32,73,74],{"class":38},"CREATE",[32,76,77],{"class":42}," DATABASE",[32,79,80],{"class":42}," imgx",[32,82,83],{"class":42}," CHARACTER",[32,85,86],{"class":42}," SET",[32,88,89],{"class":42}," utf8mb4",[32,91,92],{"class":42}," COLLATE",[32,94,95],{"class":42}," utf8mb4_unicode_ci",[32,97,99],{"class":98},"sgsFI",";\n",[11,101,102],{},"创建一个新用户",[22,104,108],{"className":105,"code":106,"language":107,"meta":27,"style":27},"language-sql shiki shiki-themes github-light","-- 创建用户，限制只能从特定 IP 访问（更安全）\nCREATE USER 'imgx'@'%' IDENTIFIED BY 'your_strong_password!';\n\n-- 如果需要限制特定 IP 访问（推荐）\n-- CREATE USER 'prod_user'@'192.168.1.%' IDENTIFIED BY 'Strong_Password_123!';\n","sql",[29,109,110,116,148,155,161],{"__ignoreMap":27},[32,111,112],{"class":34,"line":35},[32,113,115],{"class":114},"sAwPA","-- 创建用户，限制只能从特定 IP 访问（更安全）\n",[32,117,119,122,125,128,131,134,137,140,143,146],{"class":34,"line":118},2,[32,120,74],{"class":121},"sD7c4",[32,123,124],{"class":121}," USER",[32,126,127],{"class":98}," '",[32,129,130],{"class":38},"imgx",[32,132,133],{"class":98},"'@",[32,135,136],{"class":42},"'%'",[32,138,139],{"class":98}," IDENTIFIED ",[32,141,142],{"class":121},"BY",[32,144,145],{"class":42}," 'your_strong_password!'",[32,147,99],{"class":98},[32,149,151],{"class":34,"line":150},3,[32,152,154],{"emptyLinePlaceholder":153},true,"\n",[32,156,158],{"class":34,"line":157},4,[32,159,160],{"class":114},"-- 如果需要限制特定 IP 访问（推荐）\n",[32,162,164],{"class":34,"line":163},5,[32,165,166],{"class":114},"-- CREATE USER 'prod_user'@'192.168.1.%' IDENTIFIED BY 'Strong_Password_123!';\n",[11,168,169],{},"授予最小必要权限",[22,171,173],{"className":105,"code":172,"language":107,"meta":27,"style":27},"-- 授予特定数据库的必要权限\nGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, REFERENCES, LOCK TABLES \nON imgx.* TO 'imgx'@'%';\n\n\n-- 如果只需要读写权限\n-- GRANT SELECT, INSERT, UPDATE, DELETE ON production_db.* TO 'prod_user'@'%';\n",[29,174,175,180,231,255,259,263,269],{"__ignoreMap":27},[32,176,177],{"class":34,"line":35},[32,178,179],{"class":114},"-- 授予特定数据库的必要权限\n",[32,181,182,185,188,191,194,196,199,201,204,206,208,210,213,215,218,220,223,225,228],{"class":34,"line":118},[32,183,184],{"class":121},"GRANT",[32,186,187],{"class":121}," SELECT",[32,189,190],{"class":98},", ",[32,192,193],{"class":121},"INSERT",[32,195,190],{"class":98},[32,197,198],{"class":121},"UPDATE",[32,200,190],{"class":98},[32,202,203],{"class":121},"DELETE",[32,205,190],{"class":98},[32,207,74],{"class":121},[32,209,190],{"class":98},[32,211,212],{"class":121},"DROP",[32,214,190],{"class":98},[32,216,217],{"class":121},"INDEX",[32,219,190],{"class":98},[32,221,222],{"class":121},"ALTER",[32,224,190],{"class":98},[32,226,227],{"class":121},"REFERENCES",[32,229,230],{"class":98},", LOCK TABLES \n",[32,232,233,236,239,242,245,248,251,253],{"class":34,"line":150},[32,234,235],{"class":121},"ON",[32,237,238],{"class":98}," imgx.",[32,240,241],{"class":121},"*",[32,243,244],{"class":121}," TO",[32,246,247],{"class":42}," 'imgx'",[32,249,250],{"class":98},"@",[32,252,136],{"class":42},[32,254,99],{"class":98},[32,256,257],{"class":34,"line":157},[32,258,154],{"emptyLinePlaceholder":153},[32,260,261],{"class":34,"line":163},[32,262,154],{"emptyLinePlaceholder":153},[32,264,266],{"class":34,"line":265},6,[32,267,268],{"class":114},"-- 如果只需要读写权限\n",[32,270,272],{"class":34,"line":271},7,[32,273,274],{"class":114},"-- GRANT SELECT, INSERT, UPDATE, DELETE ON production_db.* TO 'prod_user'@'%';\n",[11,276,277],{},"刷新权限",[22,279,281],{"className":105,"code":280,"language":107,"meta":27,"style":27},"FLUSH PRIVILEGES;\n",[29,282,283],{"__ignoreMap":27},[32,284,285],{"class":34,"line":35},[32,286,280],{"class":98},[11,288,289],{},"验证用户权限",[22,291,293],{"className":105,"code":292,"language":107,"meta":27,"style":27},"SHOW GRANTS FOR 'imgx'@'%';\n",[29,294,295],{"__ignoreMap":27},[32,296,297,300,303,305,307,309],{"class":34,"line":35},[32,298,299],{"class":98},"SHOW GRANTS ",[32,301,302],{"class":121},"FOR",[32,304,247],{"class":42},[32,306,250],{"class":98},[32,308,136],{"class":42},[32,310,99],{"class":98},[11,312,313],{},"设置密码策略",[22,315,317],{"className":105,"code":316,"language":107,"meta":27,"style":27},"-- 设置密码过期策略（90天过期）\nALTER USER 'prod_user'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;\n\n-- 设置密码重试限制和锁定时间\nALTER USER 'prod_user'@'%' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 2;\n",[29,318,319,324,351,355,360],{"__ignoreMap":27},[32,320,321],{"class":34,"line":35},[32,322,323],{"class":114},"-- 设置密码过期策略（90天过期）\n",[32,325,326,328,330,333,335,337,340,343,346,349],{"class":34,"line":118},[32,327,222],{"class":121},[32,329,124],{"class":121},[32,331,332],{"class":42}," 'prod_user'",[32,334,250],{"class":98},[32,336,136],{"class":42},[32,338,339],{"class":121}," PASSWORD",[32,341,342],{"class":98}," EXPIRE INTERVAL ",[32,344,345],{"class":54},"90",[32,347,348],{"class":121}," DAY",[32,350,99],{"class":98},[32,352,353],{"class":34,"line":150},[32,354,154],{"emptyLinePlaceholder":153},[32,356,357],{"class":34,"line":157},[32,358,359],{"class":114},"-- 设置密码重试限制和锁定时间\n",[32,361,362,364,366,368,370,372,375,378,381,384],{"class":34,"line":163},[32,363,222],{"class":121},[32,365,124],{"class":121},[32,367,332],{"class":42},[32,369,250],{"class":98},[32,371,136],{"class":42},[32,373,374],{"class":98}," FAILED_LOGIN_ATTEMPTS ",[32,376,377],{"class":54},"3",[32,379,380],{"class":98}," PASSWORD_LOCK_TIME ",[32,382,383],{"class":54},"2",[32,385,99],{"class":98},[11,387,388],{},"密码过期后：",[390,391,392,396,399],"ul",{},[393,394,395],"li",{},"用户无法执行正常操作",[393,397,398],{},"只能执行修改密码的操作",[393,400,401],{},"会收到错误提示： ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement",[11,403,404],{},"过期后修改密码：",[22,406,408],{"className":105,"code":407,"language":107,"meta":27,"style":27},"-- 方式1：用户自己修改密码\nALTER USER USER() IDENTIFIED BY 'new_password';\n\n-- 方式2：管理员帮助修改\nALTER USER 'username'@'%' IDENTIFIED BY 'new_password';\n",[29,409,410,415,431,435,440],{"__ignoreMap":27},[32,411,412],{"class":34,"line":35},[32,413,414],{"class":114},"-- 方式1：用户自己修改密码\n",[32,416,417,419,421,424,426,429],{"class":34,"line":118},[32,418,222],{"class":121},[32,420,124],{"class":121},[32,422,423],{"class":98}," USER() IDENTIFIED ",[32,425,142],{"class":121},[32,427,428],{"class":42}," 'new_password'",[32,430,99],{"class":98},[32,432,433],{"class":34,"line":150},[32,434,154],{"emptyLinePlaceholder":153},[32,436,437],{"class":34,"line":157},[32,438,439],{"class":114},"-- 方式2：管理员帮助修改\n",[32,441,442,444,446,449,451,453,455,457,459],{"class":34,"line":163},[32,443,222],{"class":121},[32,445,124],{"class":121},[32,447,448],{"class":42}," 'username'",[32,450,250],{"class":98},[32,452,136],{"class":42},[32,454,139],{"class":98},[32,456,142],{"class":121},[32,458,428],{"class":42},[32,460,99],{"class":98},[11,462,463],{},"设置备份策略",[22,465,467],{"className":105,"code":466,"language":107,"meta":27,"style":27},"-- 授予备份权限（如果需要）\nGRANT SELECT, SHOW VIEW, PROCESS, TRIGGER ON production_db.* TO 'prod_user'@'%';\nGRANT LOCK TABLES ON production_db.* TO 'prod_user'@'%';\n\n",[29,468,469,474,500],{"__ignoreMap":27},[32,470,471],{"class":34,"line":35},[32,472,473],{"class":114},"-- 授予备份权限（如果需要）\n",[32,475,476,478,480,483,485,488,490,492,494,496,498],{"class":34,"line":118},[32,477,184],{"class":121},[32,479,187],{"class":121},[32,481,482],{"class":98},", SHOW VIEW, PROCESS, TRIGGER ",[32,484,235],{"class":121},[32,486,487],{"class":98}," production_db.",[32,489,241],{"class":121},[32,491,244],{"class":121},[32,493,332],{"class":42},[32,495,250],{"class":98},[32,497,136],{"class":42},[32,499,99],{"class":98},[32,501,502,504,507,509,511,513,515,517,519,521],{"class":34,"line":150},[32,503,184],{"class":121},[32,505,506],{"class":98}," LOCK TABLES ",[32,508,235],{"class":121},[32,510,487],{"class":98},[32,512,241],{"class":121},[32,514,244],{"class":121},[32,516,332],{"class":42},[32,518,250],{"class":98},[32,520,136],{"class":42},[32,522,99],{"class":98},[11,524,525],{},"测试新用户登录",[22,527,529],{"className":24,"code":528,"language":26,"meta":27,"style":27},"docker compose exec mysql mysql -u umami -p\n",[29,530,531],{"__ignoreMap":27},[32,532,533,535,537,539,541,543,545,548],{"class":34,"line":35},[32,534,39],{"class":38},[32,536,43],{"class":42},[32,538,46],{"class":42},[32,540,49],{"class":42},[32,542,49],{"class":42},[32,544,55],{"class":54},[32,546,547],{"class":42}," umami",[32,549,61],{"class":54},[551,552,553],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}",{"title":27,"searchDepth":118,"depth":118,"links":555},[],"2025-03-05T02:17:23.000Z","启动方式同本地","md","2025-03-09T13:07:57.000Z",{},"/post/nuxt/prod-docker-mysql-config","---\ntitle: Debian12 服务器上启动 MySQL 服务\ndate: 2025-03-05 10:17:23\nlastmod: 2025-03-09 21:07:57\ntags: [\"Docker\"]\n\n---\n启动方式同[本地](https://blog.zzao.club/post/nuxt/local-init-mysql-by-docker)\n\n```shell\ndocker compose exec mysql mysql -u root -p\n```\n\n创建一个数据库\n\n```shell\nCREATE DATABASE imgx CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n```\n\n创建一个新用户\n\n```sql\n-- 创建用户，限制只能从特定 IP 访问（更安全）\nCREATE USER 'imgx'@'%' IDENTIFIED BY 'your_strong_password!';\n\n-- 如果需要限制特定 IP 访问（推荐）\n-- CREATE USER 'prod_user'@'192.168.1.%' IDENTIFIED BY 'Strong_Password_123!';\n```\n\n\n授予最小必要权限\n\n```sql\n-- 授予特定数据库的必要权限\nGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, REFERENCES, LOCK TABLES \nON imgx.* TO 'imgx'@'%';\n\n\n-- 如果只需要读写权限\n-- GRANT SELECT, INSERT, UPDATE, DELETE ON production_db.* TO 'prod_user'@'%';\n```\n\n刷新权限\n\n```sql\nFLUSH PRIVILEGES;\n```\n\n验证用户权限\n\n```sql\nSHOW GRANTS FOR 'imgx'@'%';\n```\n\n设置密码策略\n\n```sql\n-- 设置密码过期策略（90天过期）\nALTER USER 'prod_user'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;\n\n-- 设置密码重试限制和锁定时间\nALTER USER 'prod_user'@'%' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 2;\n```\n\n密码过期后：\n- 用户无法执行正常操作\n- 只能执行修改密码的操作\n- 会收到错误提示： ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement\n\n过期后修改密码：\n\n```sql\n-- 方式1：用户自己修改密码\nALTER USER USER() IDENTIFIED BY 'new_password';\n\n-- 方式2：管理员帮助修改\nALTER USER 'username'@'%' IDENTIFIED BY 'new_password';\n```\n\n设置备份策略\n\n```sql\n-- 授予备份权限（如果需要）\nGRANT SELECT, SHOW VIEW, PROCESS, TRIGGER ON production_db.* TO 'prod_user'@'%';\nGRANT LOCK TABLES ON production_db.* TO 'prod_user'@'%';\n\n```\n\n测试新用户登录\n\n```shell\ndocker compose exec mysql mysql -u umami -p\n```\n\n",{"title":5,"description":557},"post/nuxt/prod-docker-mysql-config",[566],"Docker","KYHJfGfXZy_MOeOJ2fmnU3GrVYJCmcBc90eNdBL2Uoc",[569,573],{"title":570,"path":571,"stem":572},"OpenClaw 安装入门（Windows）","/post/zzao/openclaw/openclaw-install-windows","post/zzao/openclaw/openclaw-install-windows",{"title":574,"path":575,"stem":576},"假设你是AI，你的Skill应该是什么样的","/post/zzao/ai-skill-structure","post/zzao/ai-skill-structure",1779005086044]