diff --git a/contrib/pg_upgrade/IMPLEMENTATION.jp b/contrib/pg_upgrade/IMPLEMENTATION.jp new file mode 100644 index 0000000000000000000000000000000000000000..3623b7440962ee45259722c6c15ab173533bdd23 --- /dev/null +++ b/contrib/pg_upgrade/IMPLEMENTATION.jp @@ -0,0 +1,97 @@ +------------------------------------------------------------------------------ +PG_MIGRATOR: ç¾å ´ã§POSTGRESQLをアップグレード +------------------------------------------------------------------------------ + +ã‚るメジャーリリースã‹ã‚‰ä»–ã®ãƒ¡ã‚¸ãƒ£ãƒ¼ãƒªãƒªãƒ¼ã‚¹ã«PostgreSQLデータベースをアップグレードã™ã‚‹ã“ã¨ã¯ +費用ã®æŽ›ã‹ã‚‹ä½œæ¥ã§ã™ã€‚マイナリリースã§ã¯ã€å˜ã«æ–°è¦å®Ÿè¡Œå½¢å¼ã‚’インストールã™ã‚‹ã ã‘ã§ã€ç¾åœ¨å˜åœ¨ã™ã‚‹ +データã®æ›´æ–°ã‚’心é…ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã›ã‚“。ã—ã‹ã—ã€ãƒ¡ã‚¸ãƒ£ãƒ¼ã‚¢ãƒƒãƒ—グレードã§ã¯ã€pg_dumpを使用ã—㦠+å…¨ã¦ã®ãƒ‡ãƒ¼ã‚¿ã‚’エクスãƒãƒ¼ãƒˆã—ã€æ–°è¦ãƒªãƒªãƒ¼ã‚¹ã‚’インストールã—ã€æ–°è¦ã‚¯ãƒ©ã‚¹ã‚¿ã‚’initdbã®å®Ÿè¡Œã§ä½œæˆã—〠+ãã—ã¦æ—§ãƒ‡ãƒ¼ã‚¿ã‚’インãƒãƒ¼ãƒˆã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。巨大ãªãƒ‡ãƒ¼ã‚¿ãŒã‚ã‚‹å ´åˆã€ã“ã®ä½œæ¥ã¯ç›¸å¿œã®æ™‚é–“ã‚’å¿… +è¦ã¨ã—ã¾ã™ã€‚大ãã™ãŽã‚‹ãƒ‡ãƒ¼ã‚¿ã«å¯¾å‡¦ã™ã‚‹ã«ã¯ã€å¾“æ¥ã®ãƒ‡ãƒ¼ã‚¿ã«åŠ ãˆã¦ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã‚’å…±ã«æ ¼ +ç´ã™ã‚‹ã«è¶³ã‚Šå¾—る余裕ãŒå¿…è¦ã«ãªã‚‹ãŸã‚ã€ã•ã‚‰ã«ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’購入ã—ãªã‘ã‚Œã°ãªã‚‰ãªã„å ´åˆã‚‚考ãˆã‚‰ã‚Œã¾ã™ã€‚ + +多ãã®ã‚¢ãƒƒãƒ—グレードã®éš›ã«å¿…è¦ã¨ãªã‚‹ä½œæ¥æ™‚é–“ã¨ãƒ‡ã‚£ã‚¹ã‚¯ç©ºé–“ã‚’pg_migratorã¯å‰Šæ¸›ã—ã¾ã™ã€‚ + +------------------------------------------------------------------------------ +何を行ã†ã®ã‹ +------------------------------------------------------------------------------ + +pg_migratorã¯ç¾å ´ã§æ—¢å˜ã®ãƒ‡ãƒ¼ã‚¿ã®æ›´æ–°ä½œæ¥ã‚’è¡Œã†ãƒ„ールã§ã™ã€‚アップグレードã®ä¸ã«ã¯ã€ãƒ‡ãƒ¼ã‚¿ã®ãƒ‡ã‚£ +スク上ã«ãŠã‘る表ç¾å½¢å¼ã‚’変更ã—ã¦ã—ã¾ã„ã¾ã™ã€‚pg_migratorã¯ã“ã®ã‚ˆã†ãªã‚¢ãƒƒãƒ—グレードã®æ‰‹åŠ©ã‘ã«ã¯ãª +ã‚Šã¾ã›ã‚“。ã—ã‹ã—ã€å¤šãã®ã‚¢ãƒƒãƒ—グレードã¯ãƒ¦ãƒ¼ã‚¶å®šç¾©ã®ãƒ†ãƒ¼ãƒ–ルã®ãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã®è¡¨ç¾å½¢å¼ã‚’変更ã—ã¾ã›ã‚“。 +ã“れらã®å ´åˆã€pg_migratorã¯æ—§ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¯ãƒ©ã‚¹ã‚¿ã‹ã‚‰æ–°ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¯ãƒ©ã‚¹ã‚¿ã«æ—¢å˜ã®ãƒ¦ãƒ¼ã‚¶å®šç¾©ã® +テーブルを移動ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + +ç¾å ´ã§ã®ç§»è¡ŒãŒç¾å®Ÿæ€§ã‚’帯ã³ã‚‹ã‹ã©ã†ã‹ã‚’決定ã™ã‚‹ï¼’ã¤ã®è¦ç´ ãŒå˜åœ¨ã—ã¾ã™ã€‚ + +第一ã«ã€ã‚¯ãƒ©ã‚¹ã‚¿å†…ã®å…¨ã¦ã®ãƒ†ãƒ¼ãƒ–ルã¯ã€ãƒ†ãƒ¼ãƒ–ルヘッダã€ãƒ†ãƒ¼ãƒ–ルトレイラーã€ãŠã‚ˆã³ã‚¿ãƒ—ルヘッダã®ãƒ‡ã‚£ +スク上ã®è¡¨ç¾æ–¹å¼ã®åŒä¸€ã®ãƒ‡ã‚£ã‚¹ã‚¯ä¸Šè¡¨ç¾å½¢å¼ã‚’共有ã—ã¾ã™ã€‚ã‚‚ã—ã€ã“ã‚ŒãŒæ—§ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®PostgreSQLã¨æ–° +è¦ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®PostgreSQLã§å¤‰ã‚ã£ã¦ã„ã‚‹ã¨ã—ãŸãªã‚‰ã€æ—¢å˜ã®ãƒ†ãƒ¼ãƒ–ルを新è¦ã‚¯ãƒ©ã‚¹ã‚¿ã«ã€pg_migrator +ã¯ç§»è¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。旧データをpg_dumpã—ã€ãã—ã¦ãã®å¾Œãã®ãƒ‡ãƒ¼ã‚¿ã‚’æ–°è¦ã‚¯ãƒ©ã‚¹ã‚¿ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆ +ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + +第二ã«ã€ï¼’ã¤ã®ãƒ¡ã‚¸ãƒ£ãƒ¼PostgreSQLãƒãƒ¼ã‚¸ãƒ§ãƒ³é–“ã§ã€å…¨ã¦ã®ãƒ‡ãƒ¼ã‚¿åž‹ã¯åŒä¸€ã®ãƒã‚¤ãƒŠãƒªå½¢å¼ã§ãªã‘ã‚Œã°ãª +ã‚Šã¾ã›ã‚“。 + +------------------------------------------------------------------------------ +ã©ã®ã‚ˆã†ã«å‹•ãã®ã‹ +------------------------------------------------------------------------------ + +アップグレード間ã§pg_migratorを使用ã™ã‚‹ã«ã¯ã€æ–°è¦ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã€æœ€æ–°ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’使用ã—ã¦ã€ +無垢ã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’インストールã™ã‚‹ã“ã¨ã‹ã‚‰å§‹ã‚ã¾ã™ã€‚インストールãŒçµ‚了ã™ã‚‹ã¨ã€æ–°è¦ã‚¯ãƒ©ã‚¹ã‚¿ã«ã¯ã€æ–° +実行形å¼ã¨ã€é€šå¸¸ã®template0ã€template1ã€ãŠã‚ˆã³postgresãŒå«ã¾ã‚Œã¾ã™ãŒã€ãƒ¦ãƒ¼ã‚¶å®šç¾©ã®ãƒ†ãƒ¼ãƒ–ル +ã¯å«ã¾ã‚Œã¾ã›ã‚“。ã“ã®æ™‚点ã§ã€æ–°æ—§ã®postmasterã‚’å…±ã«åœæ¢ã—ã€pg_migratorã‚’èµ·å‹•ã•ã›ã¾ã™ã€‚ + +pg_migratorãŒèµ·å‹•ã•ã‚ŒãŸæ™‚点ã§ã€å…¨ã¦ã®å¿…é ˆå®Ÿè¡Œå½¢å¼ãŒæƒã£ã¦ã„ã¦ã€äºˆæœŸã™ã‚‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ãŒå†…包㕠+ã‚Œã„ã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚’pg_migratorãŒç¢ºè¨¼ã—ã¾ã™ã€‚ãã®æ¤œè¨¼æ‰‹é †ã¯ã€åŒæ™‚ã«æ–°æ—§ã®$PGDATAディレクトリ +ãŒäºˆæœŸã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæ£ã—ãé…ç½®ã•ã‚Œã¦ã„ã‚‹ã‹ã‚’確èªã—ã¾ã™ã€‚ã“ã®ç¢ºèªæ‰‹é †ãŒé¦–尾良ã完了 +ã™ã‚Œã°ã€pg_migratorã¯æ—§postmasterã‚’èµ·å‹•ã—ã€æ—§ã‚¯ãƒ©ã‚¹ã‚¿ã«ã‚るメタデータを確ä¿ã™ã‚‹ãŸã‚ +pg_dumpall --schema-onlyを実行ã—ã¾ã™ã€‚pg_dumpallã§ç”Ÿæˆã•ã‚ŒãŸã“ã®ã‚¹ã‚¯ãƒªãƒ—トã¯ã€æ–°è¦ã‚¯ãƒ©ã‚¹ +タ内ã®å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶å®šç¾©ã‚ªãƒ–ジェクトをå†ä½œæˆã™ã‚‹ãŸã‚ã€å¾Œã®æ‰‹é †ã§ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + +pg_dumpallã§ä½œæˆã•ã‚ŒãŸã‚¹ã‚¯ãƒªãƒ—トã¯ãƒ¦ãƒ¼ã‚¶å®šç¾©ã‚ªãƒ–ジェクトã®ã¿ã‚’å†ä½œæˆã™ã‚‹ã ã‘ã§ã€ã‚·ã‚¹ãƒ†ãƒ 定義㮠+オブジェクトã¯ä½œæˆã—ãªã„ã“ã¨ã«æ³¨æ„ãŒå¿…è¦ã§ã™ã€‚新クラスタã«ã¯æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®PostgreSQLã§ä½œæˆã• +ã‚ŒãŸã‚·ã‚¹ãƒ†ãƒ 定義オブジェクトãŒå˜åœ¨ã—ã¾ã™ã€‚ + +pg_migratorãŒæ—§ã‚¯ãƒ©ã‚¹ã‚¿ã‹ã‚‰ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’一度å–り出ã™ã¨ã€æ—¢å˜ã®ãƒ‡ãƒ¼ã‚¿ã‚’å«ã‚“ã æ–°è¦ã‚¯ãƒ©ã‚¹ã‚¿ã‚’ã€ŒåŒ +期ã•ã›ã‚‹ã€ã®ã«å¿…è¦ãªæ•°å¤šãã®è¨ˆç®—åˆã‚ã›å‡¦ç†ã‚’è¡Œã„ã¾ã™ã€‚ + +最åˆã«ã€pg_migratorã¯æ—§ã‚¯ãƒ©ã‚¹ã‚¿å†…ã®å…¨ã¦ã®ãƒ†ãƒ¼ãƒ–ル空間ディレクトリåを一時的ã«å¤‰æ›´ã—ã¾ã™ã€‚新ク +ラスタã¯åŒä¸€ã®ãƒ†ãƒ¼ãƒ–ル空間ディレクトリを使用ã—ãªã‘ã‚Œã°ãªã‚‰ãšã€ã‚‚ã—も最終段階ã§ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’ +pg_migratorãŒã‚¤ãƒ³ãƒãƒ¼ãƒˆã™ã‚‹éš›ã«ãれらã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒå˜åœ¨ã—ã¦ã„ã‚‹ã¨ã€ã‚‚ã†å…ˆã«ã¯è¡Œãã¾ã›ã‚“ã¨ä¸ +満をæ¼ã‚‰ã—ã¾ã™ã€‚ãã—ã¦ã€æ—§ã‚µãƒ¼ãƒåˆ—ã«æ ¼ç´ã•ã‚Œã¦ã„ã‚‹å…¨ã¦ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³æƒ…å ±ã‚’å‡çµã—ã¾ã™ã€‚ + +次ã«pg_migratorã¯ã€ã‚³ãƒŸãƒƒãƒˆçŠ¶æ…‹æƒ…å ±ã¨ã€æ—§ã‚¯ãƒ©ã‚¹ã‚¿ã‹ã‚‰æ–°ã‚¯ãƒ©ã‚¹ã‚¿ã¸ã€Œæ¬¡ã«ä¸Žãˆã‚‰ã‚Œã‚‹ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚· +ョンè˜åˆ¥åã€ã‚’複写ã—ã¾ã™ã€‚ã“ã®æ‰‹é †ã«ã‚ˆã£ã¦ã€æ–°ã‚¯ãƒ©ã‚¹ã‚¿ã‹ã‚‰ç‰¹å®šã®ã‚¿ãƒ—ルãŒå¯è¦–ã¨ãªã‚‹ã“ã¨ãŒä¿è¨¼ã•ã‚Œ +ã¾ã™ã€‚pg_migratorã¯ãƒ¦ãƒ¼ã‚¶å®šç¾©ã®ãƒ†ãƒ¼ãƒ–ルをインãƒãƒ¼ãƒˆãƒ»ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ãªã„ã“ã¨ã€å¾“ã£ã¦æ–°ã‚¯ãƒ©ã‚¹ã‚¿ +ã«ãŠã‘るトランザクションè˜åˆ¥åã¯æ—§ãƒ‡ãƒ¼ã‚¿ã§ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³è˜åˆ¥åã¨ä¸€è‡´ã—ãªã‘ã‚Œã°ãªã‚‰ãªã„ã“ã¨ã‚’〠+æ€ã„出ã—ã¦ãã ã•ã„。pg_migratorã¯åŒæ™‚ã«ãƒã‚°å…ˆè¡Œæ›¸ãè¾¼ã¿ï¼ˆWAL)ã®é–‹å§‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’旧クラスタã‹ã‚‰ +新クラスタã«è¤‡å†™ã—ã¾ã™ã€‚ + +ã“ã“ã¾ã§æ¥ã‚‹ã¨ã€pg_migratorã¯æ—§ã‚¯ãƒ©ã‚¹ã‚¿ã§å®šç¾©ã•ã‚ŒãŸãã‚Œãžã‚Œã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«å¯¾ã—createdbを実 +è¡Œã—ã€æ—§ã‚¯ãƒ©ã‚¹ã‚¿ã‹ã‚‰å–å¾—ã—ãŸãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’å†æ§‹ç¯‰ã—ã¾ã™ã€‚ + +新クラスタã§å…¨ã¦ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãŒä½œæˆã•ã‚ŒãŸæšã«ã¯ã€pg_migratorã¯TOASTリレーションã®åå‰ä»˜ã‘ã« +挑戦ã—ã¾ã™ã€‚TOASTテーブルã¯å¤§ãã™ãŽã‚‹è¡Œã‚’越ãˆãŸãƒ‡ãƒ¼ã‚¿ï¼ˆã¤ã¾ã‚Šã€åˆ†å‰²ã‚ŒãŸãƒ†ãƒ¼ãƒ–ãƒ«ï¼‰ã‚’æ ¼ç´ã™ã‚‹ãŸã‚ +ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚タプルã‹ã‚‰TOASTテーブルã¸ãƒ‡ãƒ¼ã‚¿ã‚’移動ã—よã†ã¨ã‚µãƒ¼ãƒãŒåˆ¤æ–ã—ãŸæ™‚点ã§ã€ã‚¿ãƒ—ル内㮠+å…ƒã¨ãªã‚‹ã‚¹ãƒãƒƒãƒˆã«ãƒã‚¤ãƒ³ã‚¿ã‚’æ ¼ç´ã—ã¾ã™ã€‚ãã®ãƒã‚¤ãƒ³ã‚¿ã«ã¯TOASTテーブルã®relfilenode(ã¤ã¾ã‚Šã€ +ファイルå)ãŒå«ã¾ã‚Œã¾ã™ã€‚ã“ã‚ŒãŒç¤ºå”†ã™ã‚‹ã¨ã“ã‚ã¯ã€TOASTã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã‚’å«ã‚€ã©ã‚“ãªãƒ†ãƒ¼ãƒ–ルã§ã‚‚ã€ã +ã‚Œãžã‚Œã®TOASTãƒã‚¤ãƒ³ã‚¿ã«ãŠã‘ã‚‹TOASTテーブルã®ãƒ•ã‚¡ã‚¤ãƒ«åã‚’æŒã£ã¦ã„ã‚‹ã“ã¨ã§ã™ã€‚従ã£ã¦ã€æ–°è¦ã‚¯ãƒ©ã‚¹ +タ内ã§æ–°ã—ã作æˆã•ã‚ŒãŸæ™‚ã«ã€TOASTテーブルãŒæ—§å称をæŒã¡ç¶šã‘ã‚‹ã“ã¨ãŒã¨ã¦ã‚‚大切ã§ã™ã€‚ +CREATE TABLEã¯TOASTテーブルã«åå‰ã‚’ã¤ã‘ã‚‹ã“ã¨ã«ä½•ã‚‚関与ã—ã¾ã›ã‚“。TOASTテーブルåãŒæ—§åを引ã +継ã„ã§ã„ã‚‹ã“ã¨ã‚’確証ã™ã‚‹ãŸã‚ã€pg_migratorã¯æ—§ã‚¯ãƒ©ã‚¹ã‚¿ã‹ã‚‰ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’インãƒãƒ¼ãƒˆã™ã‚‹å‰ã«ã€å…¨ã¦ +ã®TOASTテーブルã®å称をä¿å˜ã—ã¾ã™ã€‚ファイルåå転ã®ãŸã‚ã€pg_migratorã¯å˜ã«é©åˆ‡ãªåå‰ã‚’付ã‘㟠+空ファイルを作æˆã—ã€ã‚µãƒ¼ãƒã¯ãã®åå‰ã®è¡çªã‚’検出ã™ã‚‹ã¨ç„¡åŠ¹ã«ã—ã¾ã™ã€‚ + +次ã«ã€pg_migratorã¯ä»¥å‰ã«pg_dumpallãŒä½œæˆã—ãŸã‚¹ã‚¯ãƒªãƒ—トを実行ã—ã¾ã™ã€‚ã“ã®ã‚¹ã‚¯ãƒªãƒ—トã¯æ—§ã‚¯ãƒ© +スタã‹ã‚‰æ–°ã‚¯ãƒ©ã‚¹ã‚¿ã«å…¨éƒ¨æƒã£ãŸãƒ¦ãƒ¼ã‚¶å®šç¾©ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’効果的ã«ä½œæˆã—ã¾ã™ã€‚ãã®ã‚¹ã‚¯ãƒªãƒ—トãŒå®Œäº†ã™ã‚‹ +ã¨ã€æ–°postmasterã‚’åœæ¢ã—ãŸå¾Œã€pg_migratorã¯ãƒ—レースホルダーTOASTテーブルを削除ã—ã€æ–°ã‚¯ãƒ©ã‚¹ +タ内ã«é©åˆ‡ãªTOASTタプルåã‚’è¨å®šã—ã¾ã™ã€‚ + +最後ã«ã€pg_migratorã¯ãã‚Œãžã‚Œã®ãƒ¦ãƒ¼ã‚¶å®šç¾©ãƒ†ãƒ¼ãƒ–ルã¨ãã‚ŒãŒã‚µãƒãƒ¼ãƒˆã™ã‚‹ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã¨TOASTテー +ブルを旧クラスタã‹ã‚‰æ–°ã‚¯ãƒ©ã‚¹ã‚¿ã¸ã€ãƒªãƒ³ã‚¯ã€ã¾ãŸã¯è¤‡å†™ã—ã¾ã™ã€‚ã“ã®æœ€å¾Œã®æ‰‹é †ã§pg_migratorã¯ã€æ–° +クラスタã®pg_class.relfilenodeã«ä¸€è‡´ã™ã‚‹ã‚ˆã†ã€ãã‚Œãžã‚Œã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã«æ–°è¦å称を割り当ã¦ã¾ã™ã€‚ +上記ã§æ¦‚è¦ã‚’示ã—ãŸã‚ˆã†ã«ã€TOASTファイルåã¯ç¶æŒã•ã‚Œã¾ã™ã€‚ + +pg_migratorè¨è¨ˆã®é‡è¦ãªæ©Ÿèƒ½ã¯ã€å…ƒã¨ãªã‚‹ã‚¯ãƒ©ã‚¹ã‚¿ãŒæå‚·ã•ã‚Œãªã„よã†ã«ãªã£ã¦ã„ã‚‹ã“ã¨ã§ã™ã€‚æ›´æ–°ä¸ +ã«å•é¡ŒãŒç™ºç”Ÿã—ã¦ã‚‚以å‰ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’続ã‘ã¦ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚