Det enda sättet detta kan hända (i en klientsession) - och så som det händer för mig då och då - är att du blir biten av en kort timeout på klientanslutningen. Det går så här:
mysql> set @a = 10;
mysql> [wait for N+1 minutes, where N is the client timeout]
mysql> select @a;
+------+
| NULL |
+------+
| NULL |
+------+
1 row in set (0.00 sec)
Du måste initiera dina variabler och använda dem inom en sammanhängande klientsession. När sessionen försvinner förlorar du alla dina variabler.
Den andra förklaringen, som påpekats av andra i kommentarerna, är att kommandona träffar servern från olika anslutningar; ditt problem kanske inte är en timeout, utan att du skapar kommandona "SET ..." och "SELECT ..." i olika anslutningar. Användarvariabler delas inte mellan olika anslutningar.